美文网首页
设计模式(python实现)--模板模式(Template)

设计模式(python实现)--模板模式(Template)

作者: 远行_2a22 | 来源:发表于2020-02-02 16:03 被阅读0次

    Template Method

    动机(Motivation)

    • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
    • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

    模式定义

    定义一个操作中的算法的骨架 (稳定) ,而将一些步骤延迟 (变化) 到子类中。
    Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的
    某些特定步骤。
    ——《 设计模式》 GoF

    要点总结

    • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
    • 除了可以灵活应对子步骤的变化外, “不要调用我,让我来调用你” 的反向控制结构是Template Method的典型应用。
    • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

    例子

    一般实现

    # -*- coding:utf-8 -*-
    
    
    class Library(object):
        # 框架开发者
        def step1(self):
            print('step1')
    
        def step3(self):
            print('step3')
    
        def step5(self):
            print('step5')
    
    
    class Application(object):
        # 应用开发者
        def step2(self):
            print('step2')
            return True
    
        def step4(self):
            print('step4')
    
    def run_app():
        lib = Library()
        app = Application()
    
        lib.step1()
        if app.step2():
            lib.step3()
    
        for i in range(3):
            app.step4()
    
        lib.step5()
    
    if __name__ == '__main__':
        run_app()
    
    

    模板模式

    # -*- coding:utf-8 -*-
    
    
    class Library(object):
        # 框架开发者
        def step1(self):
            print('step1')
    
        def step3(self):
            print('step3')
    
        def step5(self):
            print('step5')
    
        def run_app(self):
    
            self.step1()
            if self.step2():
                self.step3()
    
            for i in range(3):
                self.step4()
    
            self.step5()
    
        def step2(self):
            # 需要子类重写
            pass
    
        def step4(self):
            # 需要子类重写
            pass
    
    
    class Application(Library):
        # 应用开发者
        def step2(self):
            print('step2')
            return True
    
        def step4(self):
            print('step4')
    
    
    class Application2(Library):
        # 应用开发者
        def step2(self):
            print('Application2 step2')
            return False
    
        def step4(self):
            print('Application2 step4')
    
    
    if __name__ == '__main__':
        app = Application()
        app.run_app()
    
        print('-'*10)
        app2 = Application2()
        app2.run_app()
    
    
    • 代码中,调用的整个流程run_app是稳定的,而step2step4是变化的。
    • 第一个实现版本中,将run_app交给应用开发者来写,一是冗余,二是容易写错。而 模板方法 在基类中实现整个算法的骨架 (稳定) ,而将一些步骤延迟 (变化) 到子类。
    • 例子中 模板方法 减轻了应用开发者的负担,且增加了代码的可扩展性和稳定性。

    相关文章

      网友评论

          本文标题:设计模式(python实现)--模板模式(Template)

          本文链接:https://www.haomeiwen.com/subject/kisqxhtx.html