模板方法模式
定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结果即可重定义该算法的某些特定步骤。
优点
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现
缺点
按照一般设计习惯,抽象类负责生命最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结果影响了父类发结果,也就是对父类产生了影响。
使用场景
- 多个子类有公共方法,并且逻辑基本相同时
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
- 重构时,模板方式方法是一个经常使用的一个模式,把相同代码抽取到父类,然后通过钩子函数约束其行为
Python实现
# -*- coding: UTF-8 -*-
class NewPaper:
"""抽象类,定义模板病实现了抽象模板方法"""
def question1(self):
print("题目一")
print(self.answer1())
def question2(self):
print("题目二")
print(self.answer2())
def answer1(self):
return ""
def answer2(self):
return ""
class TestPaperA(NewPaper):
"""实现父类的一个或多个抽象方法"""
def answer1(self):
return "答案A1"
def answer2(self):
return "答案A2"
class TestPaperB(NewPaper):
def answer1(self):
return "答案B1"
def answer2(self):
return "答案B2"
def main():
t = TestPaperA()
t.question1()
t.question2()
if __name__ == '__main__':
main()