Python设计模式-装饰器模式

代码基于3.5.2,代码如下;

#coding:utf-8
#装饰器模式class Beverage():name = ""price = 0.0type = "BEVERAGE"def getPrice(self):return self.pricedef setPrice(self,price):self.price = pricedef getName(self):return self.nameclass coke(Beverage):def __init__(self):self.name = "coke"self.price = 4.0class milk(Beverage):def __init__(self):self.name = "milk"self.price = 5.0class drinkDecorator():def getName(self):passdef getPrice(self):passclass iceDecorator(drinkDecorator):def __init__(self,Beverage):self.beverage = Beveragedef getName(self):return self.beverage.getName() + "  + ice"def getPrice(self):return self.beverage.getPrice() + 0.4class sugarDecorator(drinkDecorator):def __init__(self,Beverage):self.beverage = Beveragedef getName(self):return  self.beverage.getName() + "  + sugar"def getPrice(self):return self.beverage.getPrice() + 0.8if __name__ == "__main__":milk1 = milk()print(milk1.getPrice(),milk1.getName())iceMilk = iceDecorator(milk1)print(iceMilk.getPrice(),iceMilk.getName())cofe1 = coke()print(cofe1.getPrice(),cofe1.getName())sugarCofe = sugarDecorator(cofe1)print(sugarCofe.getPrice(),sugarCofe.getName())

装饰器模式分析与解读

装饰器模式

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

代码解读

该例子基于的需求:客户点饮料系统,在用户下单的过程中,可以对饮料进行相应的定制。
1、先定义了Beverage类,所有的饮料都是由该类继承而来;
2、定义drinkDecorator类,所有需要新增的功能都是由该类继承而来;
3、定义了iceDecorator类,对所点的饮料进行加冰,并且加冰后价格也需要增加;定义了sugarDecorator类,对所点的饮料进行加糖,并且加糖后价格也需要增加。
4、在客户端调用时,先生成milk1实例,然后在对milk1加冰的过程中,在iceDecorator初始化的时候就将milk1实例传入,在调用getName和getPrice时,调用milk1实例的方法后,接着处理milk1方法返回的结果,从而达到动态的更改getName和getPrice方法。

代码运行结果如下:

5.0 milk
5.4 milk  + ice
4.0 coke
4.8 coke  + sugar

装饰器模式应用场景:

1、需要扩展、增强或者减弱一个类的功能。

优缺点分析

优点

1、装饰器模式时继承方式的一个替代方案,可以轻量级的扩展被装饰对象的功能;
2、Python的装饰器模式是实现AOP的一种方式,便于相同操作位于不同调用为止的统一管理。

缺点

1、多层装饰器的调试和维护较困难。

备注

#Python装饰器模式的通用代码
def drugPrice(func):def wrapper(self,*args,**kwargs):print(self,args,kwargs)self.price += 2return func(self,*args,**kwargs)return wrapperclass Food():def __init__(self):self.price = 1@drugPricedef getPrice(self):return self.priceif __name__ == "__main__":f = Food()print(f.getPrice())

程序的输出结构如下:

<__main__.Food object at 0x1097d90b8> () {}
3

python 中的装饰器编写过程:
先定义装饰器函数

def drugPrice(func):def wrapper(self,*args,**kwargs):print(self,args,kwargs)self.price += 2return func(self,*args,**kwargs)return wrapper

该函数的调用过程如下:
当调用drugPrice(func)函数时,返回的是wrapper函数,该函数是func(self,*args,**kwargs),在wrapper(self,*args,**kwargs)的时候,就是调用的func(self,*args,**kwargs)函数,只不过此时还执行了print(self,args,kwargs);self.price += 2这段语句。

@drugPrice
def getPrice(self):return self.price

@drugPrice会被Python解析为getPrice=drugPrice(getPrice),此时可以理解为如下的执行顺序

def getPrice(self):return self.price
getPrice=drugPrice(getPrice)

然后调用getPrice()函数就会把装饰器里面的内容执行完成。
此处可以参考廖雪峰的Python教程

Python设计模式-装饰器模式相关推荐

  1. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  2. Spring设计模式(装饰器模式)

    Spring设计模式(装饰器模式) 模式的定义: 装饰者模式定义: ​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 模式的结构图 : 模式包含角 ...

  3. php装饰器模式 简书,设计模式——装饰器模式

    功能 无需改变原有对象的任何属性及其继承的情况下,动态为一个对象添加额外的职责. 实现 通过创建一个包装对象,也就是装饰来包裹真实的对象. 俺是一枚撸友,在这里借用LOL的余热,形象的将装饰器模式的实 ...

  4. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

  5. 设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.简单来说,装饰器模式就是 ...

  6. PHP设计模式——装饰器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装 ...

  7. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  8. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  9. C++设计模式 装饰器模式

    文章目录 1. 先验知识 2. 装饰器模式相关概念 3. 装饰器模式的应用 3.1 应用1: 给形状添加新的特征 不同形状加红 3.2 应用2: 给一个人穿不同的衣服 a 直接person类, 增加穿 ...

最新文章

  1. MYSQL 练习题
  2. 玩转VIM编辑器-vim附加特性
  3. 如何用Python从数据库里面获取数据?4个步骤就能轻松实现
  4. Android Bundle类,通过bundle实现在两个activity之间的通讯
  5. Q-learning家族【强化学习】
  6. 如何更改Live Writer发布照片到不同相册
  7. MySQL修改主键初始值为1
  8. the difference between a material and an effect
  9. 最流行6种微服务RPC技术,你一定要知道
  10. 免疫算法(matlab)
  11. 周立功专访:周立功和他的团队已经找到了属于自己的道路
  12. 软件测试设计之——场景设计法,判定表法
  13. 《java程序员面试笔试宝典》学习笔记
  14. 电机控制基础知识储备
  15. 大数据分析师高级证书_大数据分析师(ACP)认证考试大纲
  16. 计算机打印机安装步骤,打印机安装步骤
  17. Mysql:设置主键自动增长起始值
  18. uniapp h5地图导航
  19. 网页动态效果——随鼠标移动的动态触击式线条
  20. 【面向对象程序设计】侩子手游戏(Java、JavaFX)

热门文章

  1. Python 快速实现分列转到行!
  2. 拖拉机也将自动驾驶,日本劳动力短缺大力发展无人农业
  3. 避不开的算法,如何吃透?
  4. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记
  5. Google图嵌入工业界最新大招,高效解决训练大规模深度图卷积神经网络问题
  6. 专访云知声黄伟:场景定义芯片,未来所有场景都需要AI | AI名人堂
  7. AI一分钟 | 张亚勤:保护用户数据安全是百度的第一原则;美国开通全球首条高速自动驾驶测试路...
  8. Java 内存泄漏排查,新技能+1
  9. 聊一聊 软件系统中的“热力学第二定律”
  10. SpringBoot最最最常用的注解梳理