1. 模板模式(Template)介绍

UML类图

角色介绍

  • 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
  • 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
  • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。

抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

用途

定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

模版方法的优点及适用场景

容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。

便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。

比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。

在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

2. 示例

  • 某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了。但是A有办法,先把打印功能完成,排序功能另找人做。
  • 写完后,A找到刚毕业入职不久的同事B说:有个任务,主要逻辑我已经写好了,你把剩下的逻辑实现一下吧。于是把AbstractSort类给B,让B写实现。
"""Template Pattern with Python Code
"""from abc import abstractmethod, ABCMetaclass AbstractSort(metaclass=ABCMeta):"""将数组array由小到大排序@param array"""@abstractmethoddef sort(self, array):passdef show_sort_result(self, array):self.sort(array);print("排序结果:");for i in range(len(array)):print("%3s" % array[i])class ConcreteSort(AbstractSort):def _select_sort(self, array, index):MinValue = 32767 # 最小值变量indexMin = 0     # 最小值索引变量for i in range(index, len(array)):if array[i] < MinValue: # 找到最小值MinValue = array[i] # 储存最小值indexMin = i Temp = array[index] # 交换两数值array[index] = array[indexMin]array[indexMin] = Tempdef sort(self, array):for i in range(len(array)):self._select_sort(array, i)class Client(object):def main(self):a = [10, 32, 1, 9, 5, 7, 12, 0, 4, 3] # 预设数据数组s = ConcreteSort()s.show_sort_result(a)if __name__ == "__main__":Client().main()

输出:

# ./Template.py
排序结果:0134579101232

参考:
https://wiki.jikexueyuan.com/project/java-design-pattern/template-method-pattern.html

python设计模式22-模板模式相关推荐

  1. python设计模式之模板模式

    python设计模式之观察者模式 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...

  2. Python设计模式:模板模式

    设计模式十七:模板模式 什么是模板模式 编写优秀代码的一个要素是避免冗余: 模式关注的是消除代码冗余: 无需改变算法结构就能重新定义一个算法的某些部分. 使用场景 发现结构相近的算法中有重复代码,则可 ...

  3. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  4. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  5. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  6. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  7. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  8. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  9. 设计模式回顾——模板模式(C++)

    文章目录 1 前言 2 什么是模板模式 2.1 模板模式组成 2.2 模板模式UML图 2.3 模板模式作用 3 模板模式优缺点 4 什么地方使用模板模式 5 模板模式实现 6 模板模式与策略模式比较 ...

  10. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

最新文章

  1. [javaSE] 多线程(join方法)
  2. Hi Azure. 从零开始打造一个语音机器人,跟你的电脑聊聊天。
  3. n以内的素数c语言,关于求N以内素数的一点小问题(N小于一亿)
  4. 将MongoDB集成到您的Spring项目中
  5. pinpoint性能检测工具搭建(APM)
  6. Nodejs nmp 常用命令
  7. ImportError: Can‘t find framework /System/Library/Frameworks/OpenGL.framework.ImportError:Error occu
  8. Oracle study之--HASH Cluster特点
  9. Oracle查询优化改写技巧与案例总结三
  10. 使用BmFont制作unity可以使用的图集数字
  11. SPSS基本数据处理(二)
  12. 采购入库单参照采购订单时未带入供应商
  13. js代码前面的分号是什么意思?
  14. excel怎么一个格子斜分_表格excel怎样把一格用斜线分为三格
  15. 开放耳机有什么优缺点,推荐几款不错的开放式耳机
  16. 【写博客常用】x86,x64,arm都是什么
  17. 营改增后计算机维修费税率,2020国税维修费税率是多少?
  18. php 随机获取字母,深入PHP获取随机数字和字母的方法详解
  19. Vue组件里初始化组件,一对多
  20. OpenVZ虚拟机安装过程详解

热门文章

  1. python 打开excel并在屏幕上呈现_excel-检查文件是否在Python中打开
  2. 我的小白同事接触白鹭引擎4天,成功做了一款足球小游戏
  3. webpack打包生成的dist文件如何运行
  4. 第 9 章 代码审查制度
  5. 使Jackson和Mybatis支持JSR310标准
  6. openfire过滤脏话插件,控制消息是否发送
  7. IaaS, PaaS和SaaS及其区别
  8. 【linux学习笔记八】常用命令
  9. 《Pro ASP.NET MVC 3 Framework》学习笔记之一【MVC的历程,优点,HelloWorld】
  10. Web应用——焦点图自动浏览