装饰者模式
定义
项目:星巴兹饮料
类图
部分实现代码
from abc import ABC, abstractmethodclass Beverage(ABC):"""饮料"""description = "Unknown Beverage"def get_description(self):return self.description@abstractmethoddef cost(self) -> float: # python中无需区分double和floatpassclass CondimentDecorator(Beverage):"""调料"""@abstractmethoddef get_description(self):pass
class Espresso(Beverage):"""浓缩咖啡"""def get_description(self) -> str:return "浓缩咖啡"def cost(self) -> float:return 1.99class HouseBlend(Beverage):"""家常咖啡"""def get_description(self) -> str:return "家常咖啡"def cost(self) -> float:return 0.89
class Mocha(CondimentDecorator):"""摩卡"""def __init__(self, beverage:Beverage):self.beverage = beveragedef get_description(self) -> str:return self.beverage.get_description() + ', 摩卡'def cost(self) -> float:return self.beverage.cost() + 0.2
完整代码
from abc import ABC, abstractmethodclass Beverage(ABC):"""饮料"""description = "Unknown Beverage"def get_description(self) -> str:return self.description@abstractmethoddef cost(self) -> float: # python中无需区分double和floatpassclass CondimentDecorator(Beverage):"""调料"""@abstractmethoddef get_description(self) -> str:passclass Espresso(Beverage):"""浓缩咖啡"""def get_description(self) -> str:return "浓缩咖啡"def cost(self) -> float:return 1.99class HouseBlend(Beverage):"""综合咖啡"""def get_description(self) -> str:return "综合咖啡"def cost(self) -> float:return 0.89class DarkRoast(Beverage):"""深焙咖啡"""def get_description(self) -> str:return "深焙咖啡"def cost(self) -> float:return 0.99class Decaf(Beverage):"""低咖啡因"""def get_description(self) -> str:return "低咖啡因"def cost(self) -> float:return 1.05class Mocha(CondimentDecorator):"""摩卡"""def __init__(self, beverage: Beverage):self.beverage = beveragedef get_description(self) -> str:return self.beverage.get_description() + '+摩卡'def cost(self) -> float:return self.beverage.cost() + 0.2class Soy(CondimentDecorator):"""豆浆"""def __init__(self, beverage: Beverage):self.beverage = beveragedef get_description(self) -> str:return self.beverage.get_description() + '+豆浆'def cost(self) -> float:return self.beverage.cost() + 0.15class Whip(CondimentDecorator):"""奶泡"""def __init__(self, beverage: Beverage):self.beverage = beveragedef get_description(self) -> str:return self.beverage.get_description() + '+奶泡'def cost(self) -> float:return self.beverage.cost() + 0.1class Milk(CondimentDecorator):"""牛奶"""def __init__(self, beverage: Beverage):self.beverage = beveragedef get_description(self) -> str:return self.beverage.get_description() + '+牛奶'def cost(self) -> float:return self.beverage.cost() + 0.1if __name__ == '__main__':beverage = Espresso()print(f"{beverage.get_description()}:${beverage.cost()}")beverage2 = DarkRoast()beverage2 = Mocha(beverage2)beverage2 = Mocha(beverage2)beverage2 = Whip(beverage2)print(f"{beverage2.get_description()}:${beverage2.cost()}")beverage3 = HouseBlend()beverage3 = Soy(beverage3)beverage3 = Mocha(beverage3)beverage3 = Whip(beverage3)print(f"{beverage3.get_description()}:${beverage3.cost()}")"""运行结果:
浓缩咖啡:$1.99
深焙咖啡+摩卡+摩卡+奶泡:$1.49
综合咖啡+豆浆+摩卡+奶泡:$1.34
"""