模板方法模式
1、内容
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2、角色
-
抽象类:定义抽象的原子操作(钩子操作);实现一个模板方法的骨架
-
具体类:实现原子操作
3、适用场景
-
一次性实现一个算法的不变的部分
-
各个子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复
-
控制子类扩展
4、优点
-
提高代码复用性
将相同部分的代码放在抽象的父类中 -
提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为 -
实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
5、缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
6、示例代码
from abc import ABCMeta, abstractmethod
class IOHandler(metaclass=ABCMeta):
@abstractmethod
def open(self, name):
pass
@abstractmethod
def deal(self, change):
pass
@abstractmethod
def close(self):
pass
def process(self, name, change):
'''模板,就相当于是一个空盒子,可以往里面添加自己需要的功能。让这个函数去执行'''
self.open(name)
self.deal(change)
self.close()
class FileHandler(IOHandler):
def open(self, name):
print('打开文件')
def deal(self, change):
print('操作文件')
def close(self):
print('关闭文件')
obj = FileHandler()
obj.process('abc.txt','')