程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Python笔记:设计模式之模板方法模式

发布于2020-02-10 15:48     阅读(606)     评论(0)     点赞(29)     收藏(2)


此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的效果。

核心思想:

  • 使用一个模板方法定义好总的算法框架。
  • 子类中根据需要重新定义某些操作,但是不能修改原始模板方法。
  • 在多个算法或框架具有类似或相同的逻辑的时候,可以使用模板方法模式,以实现代码重用。
  • 当某些操作是强制子类必须实现的时候,此操作就可以定义为抽象方法,如果不是强制要求子类实现的话,则可以在基类中为它定义一个默认实现。

主要角色:

  • 接口:通常是抽象基类,定义模板方法中需要的各项操作。
  • 模板方法:即模板算法,定义好各项操作的执行顺序或算法框架。
  • 真实对象:子类通过重新实现接口中的各项操作,以便让模板方法实现不同的功能。

优缺点:

  • 优点:因为子类的实现是根据基类中的模板而来的,所以可以实现代码重用,因为有时候我们需要修改的只是模板方法中的部分操作而已。
  • 缺点:此模式的维护有时候可能会很麻烦,因为模板方法是固定的,一旦模板方法本身有修改的时候,就可能对其他的相关实现造成影响。

模板方法运用案例--钩子

    钩子是在基类中声明的方法,并且在模板方法中使用它,通常是给它定义好一个默认的实现,钩子的思想是为子类提供一个按需“钩取”的能力,因此如果子类不想使用钩子,则可以忽略钩子的相关实现。

简单示例:

复制代码
from abc import ABCMeta, abstractmethod


class Template(metaclass=ABCMeta):
    """接口:模板类"""
    @abstractmethod
    def operation_1(self):
        pass

    @abstractmethod
    def operation_2(self):
        pass

    def template_func(self):
        """模板方法:定义好具体的算法步骤或框架"""
        self.operation_1()
        self.operation_2()


class SubObj1(Template):
    """子类1:按需重新定义模板方法中的算法操作"""
    def operation_1(self):
        print('SubObj1.operation_1()')

    def operation_2(self):
        print('SubObj1.operation_2()')


class SubObj2(Template):
    """子类2:按需重新定义模板方法中的算法操作"""
    def operation_1(self):
        print('SubObj2.operation_1()')

    def operation_2(self):
        print('SubObj2.operation_2()')


if __name__ == '__main__':
    SubObj1().template_func()
    SubObj2().template_func()
复制代码

 



所属网站分类: 技术文章 > 博客

作者:听爸爸的话

链接:https://www.pythonheidong.com/blog/article/230895/f0383eb4d267c94c87ff/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

29 0
收藏该文
已收藏

评论内容:(最多支持255个字符)