1、模板方法模式定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。
子类实现的具体方法叫作基本方法,实现对基本方法高度的框架方法,叫作模板方法。
2、模板方法模式的优点
可变的部分可以充分扩展,不变的步骤可以充分封装;
提取公共代码,减少冗余代码,便于维护;
具体过程可以定制,总体流程方便掌控;
使用模板方法可以将代码的复用最大化;
子类只需要实现自己的方法,将算法和实现的耦合降低。
3、模板方法模式的使用场景
子类中有公有的方法,并且逻辑基本相同,可以使用模板模式。
4、模板方法模式的缺点
在抽象类中定义了子类的方法,即子类对父类产生了影响,部分影响了代码的可读性。
5、举例说明
未使用模板模式:
class TestPaperA(object):def question(self):print("题目")def answer(self):print('答案A')class TestPaperB(object):def question(self):print("题目")def answer(self):print('答案B')if __name__ == '__main__':print("试卷1")t1 = TestPaperA()t1.question()t1.answer()print("+++++++++++++++++++++++")print("试卷2")t2 = TestPaperB()t2.question()t2.answer()
结果:
试卷1
题目
答案A
+++++++++++++++++++++++
试卷2
题目
答案B
使用模板模式,提取公共函数:
class NewPaper(object):def question(self):print("题目")class TestPaperA(NewPaper):def question(self):print("题目")def answer(self):print('答案A')class TestPaperB(NewPaper):def question(self):print("题目")def answer(self):print('答案B')if __name__ == '__main__':print("试卷1")t1 = TestPaperA()t1.question()t1.answer()print("+++++++++++++++++++++++")print("试卷2")t2 = TestPaperB()t2.question()t2.answer()
结果:
试卷1
题目
答案A
+++++++++++++++++++++++
试卷2
题目
答案B
6、模板模式结构说明
NewPaper是抽象类,定义抽象模板并实现了抽象模板方法,TestPaper实现父类的一个或多个抽象方法。
当不变和可变的行为在子类的方法中混合在一起时,不变的行为就会在子类中重复出现,通过模板方法模式把这些行为搬到单一的地方,帮助子类摆脱重复的不变行为的纠缠。