模板方法模式是一个比较容易理解的设计模式,用一个考试的例子来讲比较通俗易懂,我们考试的时候大家用的都是同一份试卷,只是是每个人做的答案有可能不一样,如果每个人都抄一份试卷那就要完蛋了,考试时间都放在抄试卷上了,如果老师把试卷写在黑板上,那么每个同学就只需要将答案交给老师就好了,从而节约了不少时间。
首先来看《大话设计模式》中用C#写的例子,首先定义了试卷的题目和选项。
然后学生做的答案,但是学生写了很多重复的东西,比如base.TestQuestion1/2/3
,等于每次答题都要抄题目,而且还要写上“答案”关键字,那个痛苦作为过来人相信大家都懂,按照我们的过来人的经验,当然是直接写个abcd比较省事啦,把更多的时间放在思考上才能充分利用考试时间。
通过改进,用虚方法来实现答案方法,这样每个学生只需要重写Answer
方法就可以了。
改进后学生只需要交填有abcd的答题卡就好了,也就是实现虚方法中的内容就好了。
用python实现就更简单了,将上面的过程进行精简得到下面的代码,template_method
是父类要做的事,相当于老师出题,primitive_operation1/2
是子类要实现的事,相当于学生答题。
from abc import abstractmethod, ABC
'''创建模板类,将需要子类实现的方法进行抽象'''
class AbstractClass(ABC):
@abstractmethod
def primitive_operation1(self): #抽象方法1
pass
@abstractmethod
def primitive_operation2(self): #抽象方法2
pass
def template_method(self):
self.primitive_operation1()
self.primitive_operation2()
'''与ConcreteClassB不同的方法实现'''
class ConcreteClassA(AbstractClass):
def primitive_operation1(self): #实现抽象方法1
print('具体类A方法1实现')
def primitive_operation2(self): #实现抽象方法2
print('具体类A方法2实现')
'''与ConcreteClassA不同的方法实现'''
class ConcreteClassB(AbstractClass):
def primitive_operation1(self): #实现抽象方法1
print('具体类B方法1实现')
def primitive_operation2(self): #实现抽象方法2
print('具体类B方法2实现')
if __name__ == '__main__':
a = ConcreteClassA()
b = ConcreteClassB()
a.template_method()
b.template_method()