1.定义
(1)内容
定义一个操作中的算法骨架,将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(2)使用模板方法,需要用到两种角色
抽象类:抽象类的作用是是定义抽象类(钩子操作),实现一个模板方法作为算法的骨架。
具体类:具体类的作用实现原子操作。
2.实现
from abc import ABCMeta, abstractmethod
from time import sleep
# 抽象类
class Window(metaclass=ABCMeta):
@abstractmethod
def start(self, param): # 原子操作/钩子操作
pass
@abstractmethod
def repaint(self, param): # 原子操作/钩子操作
pass
@abstractmethod
def stop(self, param): # 原子操作/钩子操作
pass
def run(self, param):
"""
模板方法(具体方法),这个大逻辑就不需要自己写了
:return:
"""
self.start(param)
while True:
try:
self.repaint(param)
sleep(1)
except KeyboardInterrupt:
break
self.stop(param)
# 具体类
class MyWindow(Window):
def __init__(self, msg):
self.msg = msg
def start(self, param):
print('窗口开始运行!')
def stop(self, param):
print('窗口停止运行!')
def repaint(self, param):
print(self.msg)
param = '具体的参数'
MyWindow("Hello...").run(param=param)
3.小结
抽象类中定义了抽象方法接口、以及模板方法。
抽象方法接口又被称为钩子方法,它是具体类实现的模板,具体类要在参数、返回值和其保持一致。
具体类不用实现抽象类中的模板方法。
抽象方法中的模板方法供高层代码client调用。