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

总结

相关推荐
萧鼎42 分钟前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
好望角雾眠1 小时前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
艾伦~耶格尔1 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
星仔编程2 小时前
python学习DAY46打卡
学习
yujkss2 小时前
Python脚本每天爬取微博热搜-终版
开发语言·python
yzx9910132 小时前
小程序开发APP
开发语言·人工智能·python·yolo
飞翔的佩奇2 小时前
【完整源码+数据集+部署教程】二维码与查找模式检测系统源码和数据集:改进yolo11-CSwinTransformer
python·yolo·计算机视觉·数据集·yolo11·二维码与查找模式检测
大霞上仙2 小时前
实现自学习系统,输入excel文件,能学习后进行相应回答
python·学习·excel
Caven772 小时前
【pytorch】reshape的使用
pytorch·python
无规则ai2 小时前
动手学深度学习(pytorch版):第四章节—多层感知机(5)权重衰减
人工智能·pytorch·python·深度学习