python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

#写在前面

已经有一个礼拜多没写博客了,因为沉醉在了《妙味》这部小说里,里面讲的是一个厨师苏秒的故事。现实中大部分人不会有她的天分。我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人过。我还喜欢里面那些描写味道的文字,这会让我认真对待一日三餐。我还喜欢里面的一种态度,做事的时候要认真专注。我是个很容易急躁的人,特别是当做自己不太喜欢又不得不做的事的时候。但是很神奇,伺候花草的时候,我会一下子陶醉其中,我对花草有种痴迷的喜爱。等生活无忧的时候我会去种花,种蘑菇,像苏秒一样陶醉在自己热爱的事情里。我最喜欢的就是里面苏秒和回味的感情了,她独立,她专注于自己的事情,她有自己的世界,她不患得患失,她活在当下,她也会考虑不太远的将来。心之所向,身之所往。看完了我感觉我会让自己向自己喜欢的那种生活方式再靠拢一些。

啰嗦完了开始写今天的博客设计模式之装饰器模式

设计模式是一种类层次或者结构的的设计方式,是一种解决问题的思维方式,没有固定的公式

装饰器模式比较好理解

#引入理解装饰器

小摊上卖手抓饼,烧饼,火烧一类的都选择性加 生菜,火腿,牛肉片,鸡蛋等

老板做好的一个饼热气腾腾的,不能直接拿给顾客,要问顾客的喜好,加不加其他的东西,顾客说加牛肉片,这时候旁边的老板娘在饼上加牛肉片,然后装入袋子中,然后收钱。

这里面刚刚做好的热气腾腾的烧饼或者手抓饼就是具体的构件,

加 生菜,火腿,牛肉片,鸡蛋等 放入包装袋 这就是装饰器。

#定义

抽象构件

具体构件

抽象装饰类

具体装饰类

#角色

装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

#装饰器模式的优点

1.装饰器类和被装饰器的类是独立的,你不需要懂我,我也不需要懂你,降低耦合度

2.装饰模式是继承模式的一个替代方案

#装饰器的缺点

1.会产生很多小对象

#装饰器的使用场景

1.想给一个类增加功能,但是又不想修改原来的代码,可以

2.类的核心功能不变,只是需要添加新的功能时候

#举个例子

#小摊上卖手抓饼和火烧,手抓饼5块一个,火烧6块一个,可以加辣椒酱,生菜,鸡蛋,牛肉片,火腿片

#辣椒酱免费,生菜多加1元,鸡蛋多加2元,牛肉片多加5元,火腿片多加4元

#顾客根据自己需要进行组合选择

class Bing:

name=''

price=0.0

def getPrice(self):

return self.price

def setPrice(self,price):

self.price=price

def getName(self):

return self.name

class HandHeldCake(Bing):

def __init__(self):

self.name='手抓饼'

self.price=5

class HuoShao(Bing):

def __init__(self):

self.name='火烧'

self.price=6

class decorator:

def getName(self):

pass

def getPrice(self):

pass

class spicyDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+spicy'

def getPrice(self):

return 0

class vegatableDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+生菜'

def getPrice(self):

return 1

class eggDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+鸡蛋'

def getPrice(self):

return 2

class beefDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+牛肉片'

def getPrice(self):

return 5

class peikonDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+火腿片'

def getPrice(self):

return 4

if __name__=='__main__':

hs=HuoShao()

szb=HandHeldCake()

print(hs.getName(),hs.getPrice())

egg=eggDecorator(hs)

print(hs.getName(),egg.getName(),hs.getPrice()+egg.getPrice())

beef=beefDecorator(egg)

print(hs.getName(),egg.getName(),beef.getName(),hs.getPrice()+egg.getPrice()+beef.getPrice())

其他的想要啥自己加就可以了

1303036-20190813173602432-1993833940.png

参考

https://www.cnblogs.com/noteless/p/9603041.html

http://www.imooc.com/article/258816

还参考了其他博客,忘记添加链接了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值