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())
其他的想要啥自己加就可以了

参考
https://www.cnblogs.com/noteless/p/9603041.html
http://www.imooc.com/article/258816
还参考了其他博客,忘记添加链接了
python 设计模式之装饰器模式 Decorator Pattern的更多相关文章
- 23种设计模式之装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...
- c#设计模式之装饰器模式(Decorator Pattern)
引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...
- 【UE4 设计模式】装饰器模式 Decorator Pattern
概述 描述 动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活.是一种对象结构型模式. 套路 抽象构件(Component) 具体构 ...
- 设计模式学习--装饰者模式(Decorator Pattern)
概念: 装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性. 解决方案: 装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也也就是有 ...
- 设计模式(三)——装饰器模式(Decorator Pattern)
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...
- python设计模式之装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 用最简单的例子理解装饰器模式(Decorator Pattern)
假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的 ...
- C#设计模式之装饰者模式(Decorator Pattern)
1.概述 装饰者模式,英文名叫做Decorator Pattern.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2 ...
- php装饰器模式(decorator pattern)
十一点了. <?php /* The decorator pattern allows behavior to be added to an individual object instance ...
随机推荐
- HDFS重启集群导致数据损坏,使用fsck命令修复过程
HDFS重启集群导致数据损坏,使用fsck命令修复过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们先看一组输出 [root@flume112 ~]# hdfs fsck / ...
- HTML&CSS基础-常用选择器
HTML&CSS基础-常用选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!DOCTYPE html> <html> & ...
- 关于Istio 1.1,你所不知道的细节
本文整理自Istio社区成员Star在 Cloud Native Days China 2019 北京站的现场分享 第1则 主角 Istio Istio作为service mesh领域的明星项目,从2 ...
- 《你说对就队》第八次团队作业:Alpha冲刺 第三天
<你说对就队>第八次团队作业:Alpha冲刺 第三天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...
- jpg/jpeg/png格式的区别与应用场景
注:在存储图像时采用JPG还是PNG主要依据图像上的色彩层次和颜色数量进行选择 一..jpg/jpeg格式的图片(jpg全名:jpeg) JPG(或是JPEG): 优点: (1)占用内存小,网页加载速 ...
- 更改intellij高亮字体背景颜色
intellij工具中依次进入file -> settings -> editor -> colors & fonts -> general,在右侧窗口中将result ...
- dosbox+masm5.0编译汇编文件
在去年写过如何bc3.1编译ucos,不过现在很少去用到,但是那是用dosbox也是懵懵懂懂的,参见https://blog.csdn.net/liming0931/article/details/8 ...
- Python函数的基本使用
在编程中,无论使用什么 编程语言,函数的使用都是非常广泛的,函数能够完成特定的功能,降低编程的难度和代码重用. 1.函数的定义: 函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进 ...
- 阿里druid数据源配置及数据库密码加密
注意: 1.阿里默认只对用户密码解密 2.druid 1.0.16版本及以上的解密时需要同时配置publicKey 一.生成密文密码 1 前提:已经配置了jdk环境 1.生成密文密码需要准备druid ...
- 在CentOS7上面搭建GitLab服务器
首先要在CentOS系统上面安装所需的依赖:ssh.防火墙.postfix(用于邮件通知).wegt,以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问. 1.安装SSH协议 安装命令:sud ...