文章目录
前言
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版》专栏!关注不迷路~