Python设计模式-装饰器模式

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.name

class coke(Beverage):
    def __init__(self):
        self.name = "coke"
        self.price = 4.0

class milk(Beverage):
    def __init__(self):
        self.name = "milk"
        self.price = 5.0

class drinkDecorator():
    def getName(self):
        pass
    def getPrice(self):
        pass

class 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.4

class 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.8

if __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 += 2
        return func(self,*args,**kwargs)
    return wrapper

class Food():
    def __init__(self):
        self.price = 1
    @drugPrice
    def getPrice(self):
        return self.price

if __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这段语句。

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

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值