模板模式属于行为模式,通过模板方法来定义程序框架或算方法
可以使用抽象类来定义算法步骤,由子类来实现算法中特定步骤
适用场景
1、当多个算法或类实现类似或相同逻辑的时候
2、在子类中实现算法有助于减少重复代码的时候
3、可以让子类利用覆盖事项行为来定义多个算法的时候
主要意图
1、适用基于操作定义算法的框架
2、重新定义子类的某些操作,而无需修改算法的结构
3、实现代码重用并避免重复工作
4、利用通用接口或实现
主要术语
AbstractClass 声明一个定义算法步骤的接口
ConcreteClass 定义子类特定的步骤
TemplateMethod 通过调用步骤方法来定义算法
代码示例
# -*- coding: utf-8 -*- from abc import ABCMeta, abstractmethod class AbstractClass(metaclass=ABCMeta): @abstractmethod def operation1(self): pass @abstractmethod def operation2(self): pass def template_method(self): self.operation1() self.operation2() class ConcreteClass(AbstractClass): def operation1(self): print("ConcreteClass operation1") def operation2(self): print("ConcreteClass operation2") if __name__ == '__main__': client = ConcreteClass() client.template_method() """ ConcreteClass operation1 ConcreteClass operation2 """
模板方法模式-钩子
钩子是在抽象类中声明的方法,通常被赋予一个默认实现。
钩子背后的思想是为子类提供按需钩取算法的能力
通常,当子类必须提供时,会使用抽象方法,并且当子类的实现不是强制的时候,就会使用钩子
好莱坞原则
不要给我们打电话,我们会给你打电话。如果有适合的角色,影棚会给演员打电话
模板方法模式,是高级抽象类,安排定义算法的步骤,
根据算法的工作方式,通过调用底层类来定义各个步骤的具体实现
模板方法模式的优点
1、没有代码重复
2、模板方法模式使用继承而不是合成,因此能够对代码进行重用
3、灵活性允许子类决定如何实现算法中的步骤
模板方法模式的缺点
1、调试和理解模板方法模式中的流程序列有时会令人困惑
2、模板方法模式可能会使维护变得异常痛苦
参考
《Python设计模式第2版》第八章 模板方法模式-封装算法