2019独角兽企业重金招聘Python工程师标准>>>

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

类型:行为类模式

类图:

事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了。但是A有办法,先把打印功能完成,排序功能另找人做。

[java]  view plain copy
  1. abstract class AbstractSort {
  2. /**
  3. * 将数组array由小到大排序
  4. * @param array
  5. */
  6. protected abstract void sort(int[] array);
  7. public void showSortResult(int[] array){
  8. this.sort(array);
  9. System.out.print("排序结果:");
  10. for (int i = 0; i < array.length; i++){
  11. System.out.printf("%3s", array[i]);
  12. }
  13. }
  14. }

写完后,A找到刚毕业入职不久的同事B说:有个任务,主要逻辑我已经写好了,你把剩下的逻辑实现一下吧。于是把AbstractSort类给B,让B写实现。B拿过来一看,太简单了,10分钟搞定,代码如下:

[java]  view plain copy
  1. class ConcreteSort extends AbstractSort {
  2. @Override
  3. protected void sort(int[] array){
  4. for(int i=0; i<array.length-1; i++){
  5. selectSort(array, i);
  6. }
  7. }
  8. private void selectSort(int[] array, int index) {
  9. int MinValue = 32767; // 最小值变量
  10. int indexMin = 0; // 最小值索引变量
  11. int Temp; // 暂存变量
  12. for (int i = index; i < array.length; i++) {
  13. if (array[i] < MinValue){ // 找到最小值
  14. MinValue = array[i]; // 储存最小值
  15. indexMin = i;
  16. }
  17. }
  18. Temp = array[index]; // 交换两数值
  19. array[index] = array[indexMin];
  20. array[indexMin] = Temp;
  21. }
  22. }

写好后交给A,A拿来一运行:

[java]  view plain copy
  1. public class Client {
  2. public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组
  3. public static void main(String[] args){
  4. AbstractSort s = new ConcreteSort();
  5. s.showSortResult(a);
  6. }
  7. }

运行结果:

排序结果:  0  1  3  4  5  7  9 10 12 32

运行正常。行了,任务完成。没错,这就是模版方法模式。大部分刚步入职场的毕业生应该都有类似B的经历。一个复杂的任务,由公司中的牛人们将主要的逻辑写好,然后把那些看上去比较简单的方法写成抽象的,交给其他的同事去开发。这种分工方式在编程人员水平层次比较明显的公司中经常用到。比如一个项目组,有架构师,高级工程师,初级工程师,则一般由架构师使用大量的接口、抽象类将整个系统的逻辑串起来,实现的编码则根据难度的不同分别交给高级工程师和初级工程师来完成。怎么样,是不是用到过模版方法模式?

模版方法模式的结构

模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:

  • 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
  • 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
  • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  • 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。只要实现类中的扩展方法通过了单元测试,在模版方法正确的前提下,整体功能一般不会出现大的错误。

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

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

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

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

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

转载于:https://my.oschina.net/u/194743/blog/171216

23种设计模式(6):模版方法模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式

    · 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...

  2. 23种设计模式之工厂方法模式

    工厂方法模式的定义 定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类 工厂方法模式的通用类图: 其中 Product 负责产品的共性,实现对事物最抽 ...

  3. 23种设计模式之工厂方法模式(黑马程序员)

    工厂方法模式 一.概述 二.结构 三.实现 四.总结 在最后 一.概述 定义一个用户创建对象的工厂(接口),让接口的子类决定去实例化哪个对象,依赖其抽象编程.即工厂方法使一个类的实例化延迟到其工厂的子 ...

  4. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  5. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  6. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  7. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

  8. 23种设计模式之:模板方法模式

    转载地址:https://blog.csdn.net/zhengzhb/article/details/7405608 整理的设计模式实例:https://github.com/jinchuanchu ...

  9. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式

    装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...

  10. 23种设计模式之抽象工厂模式(Abstract Factory Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...

最新文章

  1. web前端的就业前景好不好
  2. python 删除字符串中空格
  3. jQuery实现星星评分功能
  4. 使用ueditor实现多图片上传案例
  5. java 如何让循环结束,跳过某个条件,跳出当前的多重嵌套循环
  6. professional中文_Microsoft office 2007 简体中文版
  7. 诗与远方:无题(三十八)
  8. Socket网络编程--聊天程序(2)
  9. HITS 算法(Hypertext Induced TopicSelection)
  10. 对不起,离开平台,你什么都不是
  11. 关于吾爱(52)破解网注册时临时安全验证码以及填完信息没有确认或提交按钮的问题
  12. iOS 知名公司资讯汇集~招聘内推
  13. authorized_keys与known_hosts
  14. win10更新后 chrome内核浏览器总是打开网页一直加载 甚至打不开 解决方法
  15. 请详细分析商品期货最近走势( 2016-11-29)
  16. 嗨聊:移动社交区域化发展的新思路
  17. 微信链接防拦截跳转系统 微信域名防屏蔽技术
  18. 利用Word2007查拼音(亲自实践)
  19. C#字符串截取函数Substring
  20. POJ 2763 Housewife Wind 笔记

热门文章

  1. paip.语义分析--单字动词表.txt
  2. paip.undefined reference to MainWindow::xxx from moc_mainwindow.cpp错误解决
  3. paip.提升程序稳定性---最佳实践
  4. Front: 电子邮件通讯创业新模式
  5. (转)比特币该如何扩容
  6. 阿里云正式发布云原生人才培养合作计划
  7. 【大云制造】大云PaaS平台BC-PaaS V2.4—— 治理微服务,纳管中间件,平台能力更全面!...
  8. 热释电传感器三个引脚_智能家居组件漫谈——人体传感器
  9. 【优化部署】基于matlab粒子群算法求解无线传感器WSN部署优化问题【含Matlab源码 1691期】
  10. 【优化调度】基于matlab蚁群算法求解无等待流水线调度优化问题【含Matlab源码 1516期】