基于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
"""

总结

相关推荐
YangYang9YangYan12 分钟前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
jay神14 分钟前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
guslegend21 分钟前
理论学习:什么是 Coding Agent?
学习
自传.24 分钟前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
踏着七彩祥云的小丑30 分钟前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go
有Li40 分钟前
PTCMIL:基于提示 token 聚类的全切片图像多实例学习分析文献速递/多模态医学影像最新进展
论文阅读·学习·数据挖掘·聚类·文献·医学生
程序员小远44 分钟前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
憧憬成为web高手1 小时前
l33t-hoster
学习·web安全·网络安全
:mnong1 小时前
学习创建结构行为设计模式
设计模式
GEO优化小助手1 小时前
2026临沂GEO优化公司实测解析:3家本土机构适配性参考
大数据·人工智能·python