Python设计模式-装饰器模式
来源:互联网 发布:seo软文代写多少钱 编辑:程序博客网 时间:2024/06/05 11:22
Python设计模式-装饰器模式
代码基于3.5.2,代码如下;
#coding:utf-8#装饰器模式class Beverage(): name = "" price = 0.0 type = "BEVERAGE" def getPrice(self): return self.price def setPrice(self,price): self.price = price def 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): pass def getPrice(self): passclass iceDecorator(drinkDecorator): def __init__(self,Beverage): self.beverage = Beverage def getName(self): return self.beverage.getName() + " + ice" def getPrice(self): return self.beverage.getPrice() + 0.4class sugarDecorator(drinkDecorator): def __init__(self,Beverage): self.beverage = Beverage def 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 milk5.4 milk + ice4.0 coke4.8 coke + sugar
装饰器模式应用场景:
1、需要扩展、增强或者减弱一个类的功能。
优缺点分析
优点
1、装饰器模式时继承方式的一个替代方案,可以轻量级的扩展被装饰对象的功能;2、Python的装饰器模式是实现AOP的一种方式,便于相同操作位于不同调用为止的统一管理。
缺点
1、多层装饰器的调试和维护较困难。
备注
#Python装饰器模式的通用代码def drugPrice(func): def wrapper(self,*args,**kwargs): print(self,args,kwargs) self.price += 2 return func(self,*args,**kwargs) return wrapperclass Food(): def __init__(self): self.price = 1 @drugPrice def 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 += 2 return 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这段语句。
@drugPricedef getPrice(self): return self.price
@drugPrice会被Python解析为getPrice=drugPrice(getPrice),此时可以理解为如下的执行顺序
def getPrice(self): return self.pricegetPrice=drugPrice(getPrice)
然后调用getPrice()函数就会把装饰器里面的内容执行完成。
此处可以参考廖雪峰的Python教程
阅读全文
0 0
- python设计模式之装饰器模式
- Python设计模式(八)【装饰器模式】
- Python设计模式-装饰器模式
- python设计模式之装饰器模式
- 【Python学习日记】【设计模式】装饰器(装饰模式)
- Python装饰器 decorator 设计模式
- 设计模式---装饰器模式
- 设计模式--装饰器模式
- 设计模式<装饰器模式>
- 设计模式-装饰器模式
- 设计模式--装饰器模式
- 设计模式-装饰器模式
- 设计模式--装饰器模式
- 装饰器设计模式
- 装饰器设计模式
- 装饰器设计模式
- 装饰器设计模式
- 装饰器设计模式
- python官方不支持的扩展包
- 面向对象(OOP)经典书单
- (Hibernate)Hibernate的一个注释 @Transient
- java读写txt
- TabLayout的简单使用
- Python设计模式-装饰器模式
- c语言编程----找出字符串中出现次数最多的字符
- Java
- Python数据可视化-Matplotlib学习笔记(3)--画散点图
- TabLayout和ViewPager+Fragment做滑动栏
- Ajax动态拼接下拉框实现联动效果
- 30岁程序员的选择,一线OR二线?
- ES5中Object的几种方法
- FreeRTOS简单移植到STM32F103ZET6