基于Python学习《Head First设计模式》第三章 装饰者模式

装饰者模式

定义

项目:星巴兹饮料


类图

部分实现代码

python 复制代码
from abc import ABC, abstractmethod


class Beverage(ABC):
    """饮料"""
    description = "Unknown Beverage"

    def get_description(self):
        return self.description

    @abstractmethod
    def cost(self) -> float:  # python中无需区分double和float
        pass

class CondimentDecorator(Beverage):
    """调料"""

    @abstractmethod
    def get_description(self):
        pass
python 复制代码
class Espresso(Beverage):
    """浓缩咖啡"""
    def get_description(self) -> str:
        return "浓缩咖啡"

    def cost(self) -> float:
        return 1.99


class HouseBlend(Beverage):
    """家常咖啡"""
    def get_description(self) -> str:
        return "家常咖啡"

    def cost(self) -> float:
        return 0.89
python 复制代码
class Mocha(CondimentDecorator):
    """摩卡"""

    def __init__(self, beverage:Beverage):
        self.beverage = beverage

    def get_description(self) -> str:
        return self.beverage.get_description() + ', 摩卡'

    def cost(self) -> float:
        return self.beverage.cost() + 0.2

完整代码

python 复制代码
from abc import ABC, abstractmethod


class Beverage(ABC):
    """饮料"""
    description = "Unknown Beverage"

    def get_description(self) -> str:
        return self.description

    @abstractmethod
    def cost(self) -> float:  # python中无需区分double和float
        pass


class CondimentDecorator(Beverage):
    """调料"""

    @abstractmethod
    def get_description(self) -> str:
        pass


class Espresso(Beverage):
    """浓缩咖啡"""

    def get_description(self) -> str:
        return "浓缩咖啡"

    def cost(self) -> float:
        return 1.99


class HouseBlend(Beverage):
    """综合咖啡"""

    def get_description(self) -> str:
        return "综合咖啡"

    def cost(self) -> float:
        return 0.89


class DarkRoast(Beverage):
    """深焙咖啡"""

    def get_description(self) -> str:
        return "深焙咖啡"

    def cost(self) -> float:
        return 0.99


class Decaf(Beverage):
    """低咖啡因"""

    def get_description(self) -> str:
        return "低咖啡因"

    def cost(self) -> float:
        return 1.05


class Mocha(CondimentDecorator):
    """摩卡"""

    def __init__(self, beverage: Beverage):
        self.beverage = beverage

    def get_description(self) -> str:
        return self.beverage.get_description() + '+摩卡'

    def cost(self) -> float:
        return self.beverage.cost() + 0.2


class Soy(CondimentDecorator):
    """豆浆"""

    def __init__(self, beverage: Beverage):
        self.beverage = beverage

    def get_description(self) -> str:
        return self.beverage.get_description() + '+豆浆'

    def cost(self) -> float:
        return self.beverage.cost() + 0.15


class Whip(CondimentDecorator):
    """奶泡"""

    def __init__(self, beverage: Beverage):
        self.beverage = beverage

    def get_description(self) -> str:
        return self.beverage.get_description() + '+奶泡'

    def cost(self) -> float:
        return self.beverage.cost() + 0.1


class Milk(CondimentDecorator):
    """牛奶"""

    def __init__(self, beverage: Beverage):
        self.beverage = beverage

    def get_description(self) -> str:
        return self.beverage.get_description() + '+牛奶'

    def cost(self) -> float:
        return self.beverage.cost() + 0.1


if __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
"""

总结

相关推荐
Swift社区3 分钟前
Wi-Fi 6 的核心技术特性
人工智能·python
2301_8026510811 分钟前
linux系统的学习:网络
linux·网络·学习
accept 99%12 分钟前
Lovart国内直通上线!可以来体验这款甜品“设计秘书”
python
zyf10441622 分钟前
暑期实践日志 Day44:梳理剪辑实践成果,进行学习总结
学习·计算机网络·剪辑·暑期实践·课题任务
ouynagda22 分钟前
Linux Socket 网络编程学习笔记
linux·网络·学习
开源量化GO24 分钟前
学量化:看到“2026年 AI 写 Python”内容时,先用示例和练习补交易认知
人工智能·python
我爱cope32 分钟前
【计算机网络 | 网络层12:SDN:控制平面与数据平面分离意味着什么?】
网络·学习·计算机网络·平面
SelectDB技术团队42 分钟前
StarRocks 适合做日志分析吗?
大数据·数据结构·后端·python·doris·日志分析·starrock
优化Henry43 分钟前
5G网络切片之S-NSSAIlist相关参数解析
运维·服务器·网络·笔记·学习·信息与通信
tju新生代魔迷1 小时前
Verilog HDL学习笔记(六)| 第6章 数据流建模
笔记·学习