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

总结

相关推荐
恸流失18 分钟前
DJango项目
后端·python·django
Julyyyyyyyyyyy1 小时前
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
python·selenium·pycharm·自动化
季鸢2 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
萌新小码农‍2 小时前
Spring框架学习day7--SpringWeb学习(概念与搭建配置)
学习·spring·状态模式
蓝婷儿2 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
行云流水剑2 小时前
【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools
人工智能·学习·交互
love530love2 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
蔡蓝2 小时前
设计模式-迪米特法则
设计模式·log4j·迪米特法则
一弓虽2 小时前
zookeeper 学习
分布式·学习·zookeeper
苗老大2 小时前
MMRL: Multi-Modal Representation Learning for Vision-Language Models(多模态表示学习)
人工智能·学习·语言模型