【Python设计模式】模板方法模式

模板方法模式是一个比较容易理解的设计模式,用一个考试的例子来讲比较通俗易懂,我们考试的时候大家用的都是同一份试卷,只是是每个人做的答案有可能不一样,如果每个人都抄一份试卷那就要完蛋了,考试时间都放在抄试卷上了,如果老师把试卷写在黑板上,那么每个同学就只需要将答案交给老师就好了,从而节约了不少时间。

首先来看《大话设计模式》中用C#写的例子,首先定义了试卷的题目和选项。
题目

然后学生做的答案,但是学生写了很多重复的东西,比如base.TestQuestion1/2/3,等于每次答题都要抄题目,而且还要写上“答案”关键字,那个痛苦作为过来人相信大家都懂,按照我们的过来人的经验,当然是直接写个abcd比较省事啦,把更多的时间放在思考上才能充分利用考试时间。
答案1

通过改进,用虚方法来实现答案方法,这样每个学生只需要重写Answer方法就可以了。
答案2

改进后学生只需要交填有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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值