Head First 设计模式——装饰器(Decorator Pattern)——Python实现
2011-06-14 15:35
661 查看
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:liuyuan_jq
2011-06-14
你可以用一个或多个装饰者包装一个对象。
既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
[/b][/b]
我们要以饮料为主体,然后在运 行时以调料来“装饰”(decorate)饮料。比方说,如果顾客想要摩卡 和奶泡深焙咖啡
拿一个深焙咖啡(DarkRoast)对象
以摩卡(Mocha)对象装饰它
以奶泡(Whip)对象装饰它
调用cost()方法,并依赖委托(delegate)将调料的价钱加上去
condiment.py
作者:liuyuan_jq
2011-06-14
装饰者模式
动态地将责任附加到对象上。 若要扩展功能,装饰者提供了比继承更有弹性 的替代方案。设计原则
类应该对扩展开放,对修改关闭。装饰者的特点
装饰者和被装饰对象有相同的超类型。你可以用一个或多个装饰者包装一个对象。
既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
StarBuzz星巴兹咖啡
问题:因为StarBuzz的咖啡和调料总类很多,且有多种组合形式。如果使用继承的方式,会导致类膨胀且类不易于扩展。
[b][b]以装饰者构造饮料订单流程
[/b][/b]我们要以饮料为主体,然后在运 行时以调料来“装饰”(decorate)饮料。比方说,如果顾客想要摩卡 和奶泡深焙咖啡
拿一个深焙咖啡(DarkRoast)对象
以摩卡(Mocha)对象装饰它
以奶泡(Whip)对象装饰它
调用cost()方法,并依赖委托(delegate)将调料的价钱加上去
源码
beverage.py#!/usr/bin/env python # -*- coding:utf-8 -*- class Beverage(object): """ 饮料接口类 """ description = "Unknown Beverage" def getDescription(self): return self.description def cost(self): raise NotImplementedError("abstract Beverage") class Espresso(Beverage): """ 浓缩咖啡 """ def __init__(self): self.description = "Espresso" def cost(self): return 1.99 class DarkRoast(Beverage): """ 深焙咖啡 """ def __init__(self): self.description = "Dark Roast Coffee" def cost(self): return .99 class Decaf(Beverage): """ 低咖咖啡 """ def __init__(self): description = "Decaf Coffee" def cost(self): return 1.05 class HouseBlend(Beverage): """ 综合咖啡 """ def __init__(self): description = "House Blend Coffee" def cost(self): return .89
condiment.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from beverage import Beverage class CondimentDecorator(Beverage): """ 装饰者基类 """ def getDescription(self): raise NotImplementedError("abstract CondimentDecorator") class Whip(CondimentDecorator): """ 奶泡 """ def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", Whip" def cost(self): return .10 + self.beverage.cost() class Soy(CondimentDecorator): """ 豆浆 """ def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", Soy" def cost(self): return .15 + self.beverage.cost() class Mocha(CondimentDecorator): """ 摩卡 """ def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", Mocha" def cost(self): return .20 + self.beverage.cost() class Milk(CondimentDecorator): """ 牛奶 """ def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", Milk" def cost(self): return .10 + self.beverage.cost()
测试
#!/usr/bin/env python # -*- coding:utf-8 -*- from beverage import * from condiment import * # 浓缩咖啡价格 beverage = Espresso() print(beverage.getDescription() + " $" + str(beverage.cost())) # 深焙咖啡 + 2份摩卡 + 奶泡 beverage2 = DarkRoast() beverage2 = Mocha(beverage2) beverage2 = Mocha(beverage2) beverage2 = Whip(beverage2) print(beverage2.getDescription() + " $" + str(beverage2.cost())) # 综合咖啡 + 豆浆 + 摩卡 + 奶泡 beverage3 = HouseBlend() beverage3 = Soy(beverage3) beverage3 = Mocha(beverage3) beverage3 = Whip(beverage3) print(beverage3.getDescription() + " $" + str(beverage3.cost()))
Espresso $1.99 Dark Roast Coffee, Mocha, Mocha, Whip $1.49 Unknown Beverage, Soy, Mocha, Whip $1.34
相关文章推荐
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(2)
- Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(3)
- Head First 设计模式——策略模式(Strategy Pattern)——Python实现
- Head First 设计模式——观察者模式(Observer Pattern)——Python实现(1)
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- Python实现设计模式--02.工厂模式(Factory Pattern)
- 设计模式(十二)-装饰器模式(Decorator Pattern)——装饰边框与被饰物的一致性
- nf设计模式 - 修饰模式 (Decorator pattern) 的 Java 实现
- Head First 设计模式 (四) 工厂模式(factory pattern) C++实现
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- Python实现设计模式--04.模版方法模式(Template Method Pattern)
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- Python实现设计模式--05.建造者模式(Builder Pattern)
- Python实现设计模式--03.抽象工厂模式(Abstract Factory Pattern)
- Head First 设计模式 (六) 命令模式(Command pattern) C++实现
- 23种设计模式之python实现--Decorator模式
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
- Head First 设计模式—Python实现
- Head First 设计模式----DecoratorPattern