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 ...
随机推荐
- PAT1125
总体思路 这道题就是一道贪心题. 对我来说,这道题的关键在于他在说什么(黑人问号???),一开始读了几遍都不知道在讲什么,怎么一根绳子对折后就和另一根套上了? 描述上面确实让人比较迷糊,配图也不是很明 ...
- 使用 create-react-app 快速构建 React 开发环境
在终端执行以下命令创建项目: 1.指定创建的项目位置(这里以桌面为例) cd Desktop 2.创建 React 项目 npx create-react-app my-app 3.进入项目并启动 c ...
- 《CoderXiaoban》第八次团队作业:Alpha冲刺5
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件测试基 ...
- Laravel下载地址合集
laravel官网直接下载地址都没了. 都要用composer装? 在此记录一下直接下载地址 master https://github.com/laravel/laravel/archiv ...
- PLSQl的使用技巧与快捷键
最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式, ...
- 常用的HTTP状态码,网站开发请求状态必备
成功的状态码: 200 – 服务器成功返回网页 304 – 未修改 失败的状态码: 404 – 请求的网页不存在 503 – 服务器暂时不可用 500 – 服务器内部错误 下面的不是很常用,记住上面那 ...
- [Noip2018普及]摆渡车
生涯回忆录彻底摸了...反正也没啥人看( 过几天要给普及组神犇讲课就寻思做一点普及题,然后差点被锤爆,, 题在luogu上找的https://www.luogu.org/problemnew/show ...
- Pytest权威教程14-缓存:使用跨执行状态
目录 缓存:使用跨执行状态 使用方法 首先只重新运行故障或故障 上次运行中没有测试失败时的行为 新的config.cache对象 检查缓存内容 清除缓存内容 逐步修复失败用例 unittest.Tes ...
- Django重定向你是如何实现的?用的什么状态码?
使用HttpResponseRedirect redirect和reverse 状态码:302,301
- 菜鸟的算法入门:java的链表操作
从C语言的指针开始,我的算法之路就结束了! 今天为了找个好的实习,不得不捡起来,写了三年的web,算法落下了太多了 今天在leetcode上刷题,难在了一个简单的链表上,因此记录一下 题目:给定两个非 ...