第二十三章 模板模式
1. 核心思想
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. UML类图
3. 框架代码
from abc import ABC,abstractmethod
import sys
class Template(ABC):
@abstractmethod
def stepOne(self):
pass
@abstractmethod
def stepTwo(self):
pass
def templateMethod(self):
self.stepOne()
self.stepTwo()
class TemplateImplA(Template):
def stepOne(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
def stepTwo(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
class TemplateImplB(Template):
def stepOne(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
def stepTwo(self):
print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")
if __name__ == "__main__":
a = TemplateImplA()
a.templateMethod()
print()
b = TemplateImplB()
b.templateMethod()
4. 模型说明
4.1 设计要点
两个重要的组成部分:
- 抽象模板类(Template):把不变的行为、方法和属性移到父类中,去除子类中的重复代码来体现它的优势;
- 模板类具体子类(TemplateImpl):子类实现模板父类的某些细节,满足个性化的需求;
4.2 优缺点
- 优点
- 模板方法模式是通过把不变的行为挪到一个统一的父类,从而达到去除子类中重复代码的目的。
- 子类实现模板父类的某些细节,有助于模板父类的扩展。
- 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
- 缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
5. 应用场景
- 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。