当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、模板方法模式的钩子方法
  • 二、模板方法模式的钩子方法示例


前言

GOF设计模式分三大类:

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

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

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

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

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

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

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

在这里插入图片描述

"""模板方法模式:钩子方法示例"""

### 抽象类


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
  • 客户端代码
### 客户端代码
if __name__ == "__main__":
    viewer: DataViewer = BarChartViewer()
    viewer.process()
  • 输出结果
从 XML 文件中获取数据。
以柱状图显示数据。

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

相关文章:

  • 高效集成聚水潭采购退货数据到MySQL的最佳实践
  • 4-文件导入功能文档
  • 零成本本地化搭建开源AI神器LocalAI支持CPU推理运行部署方案
  • Redis 集合(Set)
  • HTTP 各版本协议简介
  • kotlin与MVVM的结合使用总结(三)
  • 深度学习之卷积神经网络(CNN)
  • 跨国企业网络案例分析:SD-WAN智能组网
  • 用DasViewer的时候3Dtiles 转osgb 可以直接指定目标坐标系吗?
  • 电路原理(电容 集成电路NE555)
  • python学习笔记
  • ROS实践(五)机器人自动导航(robot_navigation)
  • Science Advances 视触觉传感机制的交互装置,可以实时测量来自手不同部位的分布力
  • OSPF-2 邻接建立关系
  • CentOS7安装DNS服务器bind
  • 为什么 NFS 不适合作为 TDengine 的数据存储
  • 在使用element-ui时表单的表头在切换页面时第一次进入页面容易是白色字体解决方法
  • SSR 框架是什么?
  • C#中继承的核心定义‌
  • 创新实践分享:基于边缘智能+扣子的智能取物机器人解决方案
  • 陈刚:推动良好政治生态和美好自然生态共生共优相得益彰
  • 一旅客因上错车阻挡车门关闭 ,株洲西高铁站发布通报
  • 上市公司重大资产重组新规九要点:引入私募“反向挂钩”,压缩审核流程
  • 深圳南澳码头工程环评将再次举行听证会,项目与珊瑚最近距离仅80米
  • 龚正会见哥伦比亚总统佩特罗
  • 中拉互联网发展与合作论坛在西安开幕