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 ...
随机推荐
- 使用Arduino开发板制作交流电压表
在本文中,我们将使用Arduino开发板制作一个交流电压测量装置,测量我们家中交流电源的电压.我们将在Arduino IDE的串行监视器上打印输出该电压,并在万用表上显示出来. 制作数字电压表比模拟电 ...
- C#屏蔽Alt+F4组合键
在开发的软件不希望用户关闭的情况下,或者我们不想用户回到桌面,这时候我们就需要屏蔽windows键,或者Alt + F4 键等. //1.将窗体的属性KeyPrieview设置为true //keyp ...
- python网络-静态Web服务器案例(29)
一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...
- tomcat访问manager
在配置好Tomcat7/8后,我们往往需要访问Tomcat7/8的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localho ...
- linux下svn的使用
环境搭建: yum install subversion yum安装svn服务 svn --version 检查是否安装 cd /usr/local/svn/conf 找到conf 文件 ...
- 《The One!团队》第八次作业:ALPHA冲刺(一)
项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件测试基础技术.(2)学习迭代式增量软件开发过程(Scrum) 第一天 ...
- stm32中使用cubemx配置freertos的信号量大小
在配置freertos的情况下,cubemx会自动计算每个任务.信号,队列和软件定时器的使用堆栈大小,因此要合理规划 信号量默认是88byte 任务根据设定来计算,我默认配置是128,则最终是624b ...
- Hive 实现update和delete(转载)
原文链接:https://blog.csdn.net/xueyao0201/article/details/79387647 因为业务要求,需要对Hive表进行delete,在官网查询后,发现upda ...
- Logparser
http://www.microsoft.com/en-us/download/details.aspx?id=24659 Logparser 的用法 https://www.cnblogs.com/ ...
- man、whatis、apropos命令
man命令类似于Linux的帮助文档. 1.man1提供给普通用户的可执行命令说明: 输入man 1 ls 后,结果如下: 结果分析: (1)NAME:命令的名称: (2)SYNOPSIS:参数的使用 ...