前言
模板方法模式属于行为型模式,假设要开发1个桌面应用,可以确定每个窗口都有开启、关闭、定时重新绘制功能。
一、模板方法模式
模板方法模式主要涉及2个核心类:
- 抽象类:可以称之为1个父类/接口
- 具体类:该父类的子类
1.概念
定义1个操作中的算法骨架,而将一些细节的步骤延迟到子类中实现。
模板方法使得子类可以不改变1个算法的结构即可重新定义该算法的某些特点步骤。
2.角色
- 抽象类(AbstractClass):定义抽象原子操作(钩子操作)、实现1个模板方法作为算法骨架
- 具体类(ConcreteClass):自动继承抽象类中定义的模板方法、手动实现抽象类中定义的原子/构造操作
3.适用场景
- 1次性实现1个算法的不变部分
- 各子类中的公共行为应该被提取出来并集中到1个公共父类中以避免代码重复
- 控制子类随意扩展
4.代码
from abc import ABC, abstractmethod from time import sleep # 抽象类:定义骨架,定义了很多原子/构造操作、固定不变的模板方法 class Window(ABC): # 原子/钩子操作:变的东西,需要子类具体实现 @abstractmethod def start(self): pass # 原子/钩子操作:变的东西,需要子类具体实现 @abstractmethod def repaint(self): pass # 原子/钩子操作:变的东西,需要子类具体实现 @abstractmethod def stop(self): pass # 模板方法:框架不变的东西,不需要子类再次实现、和重新 # 不需要@abstractmethod,子类会自动继承模板方法 def run(self): self.start() while True: try: self.repaint() sleep(1) except KeyboardInterrupt: break self.stop() # 具体类:子类在不改变算法骨架父类(Window类)的前提下,重新定义该算法骨架的某些特定的、需要改变的方法 class MyWindow(Window): def __init__(self, msg): self.msg = msg def start(self): print("窗口开始运行") def stop(self): print("窗口结束运行") def repaint(self): print(self.msg) # 高层代码(Client) if __name__ == '__main__': MyWindow("Hello。。").run()
参考