一、模式定义
1.模板方法模式(Template Method Pattern):定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.模板方法是一种类行为型模式。
二、模式结构
模板方法模式包含如下角色:
1. AbstractClass(抽象类)
在抽象类中定义一系列基本操作(Primitive Operations),这些基本操作可以是具体的。也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义并实现一个算法的各个步骤。同时,在抽象类中实现了一个模板方法,用于定义一个算法的骨架,此模板方法不仅可以调用基本操作,还可以调用在抽象类中声明而在其子类中实现的抽象方法,当然也可以调用其他对象中的方法。
2.ConcreteClass(具体子类)
具体子类是抽象类的子类,用于实现在父类中定义的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中实现的具体基本操作。
三、例子
1. AbstractClass
# @Time : 2022/11/29 16:41
# @Author : ZQH
# @FileName: AbstractClass.py
# @Software: PyCharm
from abc import ABCMeta, abstractmethod
from time import sleep
class Window(metaclass=ABCMeta):
@abstractmethod
def start(self):
pass
@abstractmethod
def repaint(self):
pass
@abstractmethod
def stop(self):
pass
def run(self):
self.start()
while True:
try:
self.repaint()
sleep(1)
except KeyboardInterrupt:
self.stop()
break
2.ConcreteClass
# @Time : 2022/11/29 16:41
# @Author : ZQH
# @FileName: ConcreteClass.py
# @Software: PyCharm
from AbstractClass import 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)
3.Client
from ConcreteClass import MyWindow
if __name__ == '__main__':
myWindow = MyWindow('hello')
myWindow.run()
四、优缺点
1.模板方法模式的优点
(1) 模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理,模板方法模式的优势是在子类定义详细的处理算法时不会改变算法的结构。
(2) 模板方法模式是一种代码复用的基本技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为。
(3) 模板方法模式提供了一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。
2.模板方法模式的缺点
每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。