设计模式Python版 模板方法模式(下)

文章目录


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

接上一部分:《设计模式Python版 模板方法模式(上)》

一、模板方法模式的钩子方法

钩子方法的引入使得子类可以控制父类的行为

  • 最简单的钩子方法就是空方法
python 复制代码
def display():
    pass
  • 另一种钩子方法可以用于对其他方法进行约束,这种钩子方法通常返回一个boolean类型的值,即返回true或false,用来判断是否执行某一个基本方法。

二、模板方法模式的钩子方法示例

  • 一个数据图表显示功能,该功能的实现包括以下步骤:
    • (1)从数据源获取数据。
    • (2)将数据转换为XML格式。
    • (3)以某种图表方式显示XML格式的数据。
  • 该功能支持多种数据源和多种图表显示方式,但所有的图表显示操作都基于XML格式的数据,因此可能需要对数据进行转换。如果从数据源获取的数据已经是XML格式则无须转换。
  • 定义一个钩子方法is_not_xml_data() 来对数据转换方法进行控制。
python 复制代码
"""模板方法模式:钩子方法示例"""

### 抽象类


class DataViewer:
    """数据图表显示"""

    def get_data(self):
        """基本,抽象方法:获取数据"""
        raise NotImplementedError

    def convert_data(self):
        """基本,具体方法:数据转换"""
        print("将数据转换为XML格式。")

    def display_data(self):
        """基本,抽象方法:显示数据"""
        raise NotImplementedError

    def is_not_xml_data(self) -> bool:
        """钩子方法"""
        return True

    def process(self):
        """模板方法"""
        self.get_data()
        if self.is_not_xml_data():
            self.convert_data()
        self.display_data()


### 具体子类


class BarChartViewer(DataViewer):
    """柱状图"""

    def get_data(self):
        print("从 XML 文件中获取数据。")

    def display_data(self):
        print("以柱状图显示数据。")

    def is_not_xml_data(self) -> bool:
        """覆盖父类的钩子方法"""
        return False
  • 客户端代码
python 复制代码
### 客户端代码
if __name__ == "__main__":
    viewer: DataViewer = BarChartViewer()
    viewer.process()
  • 输出结果
sh 复制代码
从 XML 文件中获取数据。
以柱状图显示数据。

您正在阅读的是《设计模式Python版》专栏!关注不迷路~

相关推荐
庄小焱7 分钟前
设计模式——代理设计模式(结构型)
设计模式
YYXZZ。。35 分钟前
PyTorch——线性层及其他层介绍(6)
pytorch·python·深度学习
哆啦A梦的口袋呀40 分钟前
基于Python学习《Head First设计模式》第三章 装饰者模式
python·学习·设计模式
哆啦A梦的口袋呀42 分钟前
基于Python学习《Head First设计模式》第五章 单件模式
python·学习·设计模式
love530love1 小时前
【笔记】Windows 下载并安装 ChromeDriver
人工智能·windows·笔记·python·深度学习
Dxy12393102161 小时前
DrissionPage 异常处理实战指南:构建稳健的网页自动化防线
运维·爬虫·python·自动化·drissionpage
季鸢1 小时前
Java设计模式之备忘录模式详解
java·设计模式·备忘录模式
chao_7892 小时前
链表题解——反转链表【LeetCode】
开发语言·python·算法
⁤͏͏⁦⁠͏2 小时前
6月2日day43打卡
python
大写-凌祁2 小时前
GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导
论文阅读·人工智能·笔记·python·深度学习·机器学习·计算机视觉