如何制作网站平台,网页设计素材主题,西安比较好的软件公司,wordpress密码对的登不不了6-Python与设计模式–装饰器模式
一、快餐点餐系统
又提到了那个快餐点餐系统#xff0c;不过今天我们只以其中的一个类作为主角#xff1a;饮料类。 首先#xff0c;回忆下饮料类#xff1a;
class Beverage():name price 0.0type BEVERAGE…6-Python与设计模式–装饰器模式
一、快餐点餐系统
又提到了那个快餐点餐系统不过今天我们只以其中的一个类作为主角饮料类。 首先回忆下饮料类
class Beverage():name price 0.0type BEVERAGEdef getPrice(self):return self.pricedef setPrice(self, price):self.price pricedef getName(self):return self.nameclass coke(Beverage):def __init__(self):self.name cokeself.price 4.0class milk(Beverage):def __init__(self):self.name milkself.price 5.0除了基本配置快餐店卖可乐时可以选择加冰如果加冰的话要在原价上加0.3元 卖牛奶时可以选择加糖如果加糖的话要原价上加0.5元。怎么解决这样的问题 可以选择装饰器模式来解决这一类的问题。首先定义装饰器类 class drinkDecorator():def getName(self):passdef getPrice(self):passclass iceDecorator(drinkDecorator):def __init__(self,beverage):self.beveragebeveragedef getName(self):return self.beverage.getName() icedef getPrice(self):return self.beverage.getPrice()0.3class sugarDecorator(drinkDecorator):def __init__(self,beverage):self.beveragebeveragedef getName(self):return self.beverage.getName() sugardef getPrice(self):return self.beverage.getPrice()0.5构建好装饰器后在具体的业务场景中就可以与饮料类进行关联。 以可乐冰为例示例业务场景如下
if __name____main__:coke_colacoke()print Name:%s%coke_cola.getName()print Price:%s%coke_cola.getPrice()ice_cokeiceDecorator(coke_cola)print Name:%s % ice_coke.getName()print Price:%s % ice_coke.getPrice()打印结果如下 Name:coke Price:4.0 Name:coke ice Price:4.3 二、装饰器模式
装饰器模式定义如下动态地给一个对象添加一些额外的职责。在增加功能方面
装饰器模式比生成子类更为灵活。装饰器模式和上一节说到的代理模式非常相似可以认为装饰器模式就是代理模式的一个特殊应用
两者的共同点是都具有相同的接口不同点是侧重对主题类的过程的控制而装饰模式则侧重对类功能的
加强或减弱。上一次说到JAVA中的动态代理模式是实现AOP的重要手段。而在Python中
AOP通过装饰器模式实现更为简洁和方便。先来解释一下什么是AOP。AOP即Aspect Oriented Programming中文翻译为面向切面的编程它的含义可
以解释为如果几个或更多个逻辑过程中这类逻辑过程可能位于不同的对象不同的接口当中有重复的操
作行为就可以将这些行为提取出来即形成切面进行统一管理和维护。举例子说系统中需要在各个地方
打印日志就可以将打印日志这一操作提取出来作为切面进行统一维护。从编程思想的关系来看可以认为AOP和OOP面向对象的编程是并列关系二者是可以替换的也可以结合起来用。实际上在Python语言中是天然支持装饰器的如下例
def log(func):def wrapper(*args, **kw):print call %s(): % func.__name__return func(*args, **kw)return wrapperlog
def now():print 2016-12-04
if __name____main__:now()打印如下 call now(): 2016-12-04 log接口就是装饰器的定义而Python的语法部分则直接支持装饰器的使用。
如果要在快餐点餐系统中打印日志该如何进行AOP改造呢可以借助类的静态方法或者类方法来实现
class LogManager:staticmethoddef log(func):def wrapper(*args):print Visit Func %s%func.__name__return func(*args)return wrapper在需要打印日志的地方直接LogManager.log即可打印出访问的日志信息。 如在beverage类的函数前加上LogManager.log场景类保持不变则打印结果如下 Visit Func getName Name:coke Visit Func getPrice Price:4.0 Visit Func getName Name:coke ice Visit Func getPrice Price:4.3 三、装饰器模式的优点和应用场景 优点 1、装饰器模式是继承方式的一个替代方案可以轻量级的扩展被装饰对象的功能 2、Python的装饰器模式是实现AOP的一种方式便于相同操作位于不同调用位置的统一管理。 应用场景 1、需要扩展、增强或者减弱一个类的功能如本例。 四、装饰器模式的缺点 1、多层装饰器的调试和维护有比较大的困难。