转载地址:https://blog.csdn.net/zhengzhb/article/details/7405608

整理的设计模式实例:https://github.com/jinchuanchuan/design-patterns

一、定义、类型及类图

  • 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
  • 类型:行为类模式
  • 类图:第二图出自——《大话设计模式》

二、示例

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

abstract class AbstractSort {/*** 将数组array由小到大排序* @param array*/protected abstract void sort(int[] array);public void showSortResult(int[] array){this.sort(array);System.out.print("排序结果:");for (int i = 0; i < array.length; i++){System.out.printf("%3s", array[i]);}}
}

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

class ConcreteSort extends AbstractSort {@Overrideprotected void sort(int[] array){for(int i=0; i<array.length-1; i++){selectSort(array, i);}}private void selectSort(int[] array, int index) {int MinValue = 32767; // 最小值变量int indexMin = 0; // 最小值索引变量int Temp; // 暂存变量for (int i = index; i < array.length; i++) {if (array[i] < MinValue){ // 找到最小值MinValue = array[i]; // 储存最小值indexMin = i; }}Temp = array[index]; // 交换两数值array[index] = array[indexMin];array[indexMin] = Temp;}
}

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

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

运行结果:

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

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

三、模板方法模式的结构

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

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

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

四、模板方法的有点及适用场景

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

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

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

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

其他好的例子:https://blog.csdn.net/jason0539/article/details/45037535

23种设计模式之:模板方法模式相关推荐

  1. 【Unity3D与23种设计模式】模板方法模式(Template Method)

    GoF中定义: "在一个操作方法中定义算法的流程,其中某些步骤由子类完成. 模板方法模式让子类在不变更原有算法流程的情况下,还能够重新定义其中的步骤" 每一次武器攻击目标时,都要按 ...

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

    · 模板方法模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,有查看所有英雄功能,并且玩家在查看英雄时可以对英雄的排序做调整.具体而言,玩家可以按照默认排序.名称排序.熟练度排序.上架时间排序.荣耀 ...

  3. 【设计模式】23种设计模式之模板方法模式

    模板方法模式 定义 在一个抽象基类的方法中定义一个算法的骨架,算法的每一个步骤都可以延迟到子类,由子类重写.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. UML类图 使用场 ...

  4. 23种设计模式之模板方法

    23种设计模式总篇:chenmingyu.top/design/ 模板方法 模板方法属于行为型模式 定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定 ...

  5. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  6. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  7. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  8. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  9. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  10. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

最新文章

  1. 解决tensorflow报错ValueError: Variable conv1/weights already exists, disallowed.
  2. K:hash(哈希)碰撞攻击
  3. 006_Buzz属性和组
  4. Prolog基本程序
  5. 前端面试每日 3+1(每日三问)
  6. EasyOcr 安装(linux、docker)、使用(gin、python)
  7. C语言,期末复习之编写程序返回三个整数中的中间数
  8. 22个ES6面试、复习干货知识点汇总
  9. SOS宣布与融合子公司成立一家合资企业,专注区块链资产和加密货币等业务
  10. louvian算法 缺点 优化_黑帽SEO、快排、白帽SEO的介绍与优缺点的对比
  11. 移动端Vin码识别-车架号识别SDK
  12. 吴伯凡-认知方法论-认知是一个长期修炼的过程
  13. 甲骨文公司老板埃里森在耶如大学的…
  14. 万人总结的软件测试面试简历及软件测试面试题
  15. web前端人员每天必须关注的前端社区网站
  16. 咸鱼之王攻略及Mac M1 M2 系统电脑挂机解决无法登录的问题
  17. 设计模式 访问者模式
  18. 某人写的openCV学习笔记
  19. 域渗透|NTLM 中继攻击
  20. 【光流估计】无监督学习中的遮挡区域

热门文章

  1. 阅读 | 001《人工智能导论》(二)知识获取篇
  2. mybatis分页插件--列表切割成分页查询
  3. 数位板光标抖动 - 解决方案
  4. 兼容和图片整合(浏览器相关及兼容问题)
  5. 蓝奏云客户端 v0.2.5,第三方蓝奏网盘电脑版
  6. Android -- 相册图片发送彩信
  7. vue中根据用户昵称首字母生成头像和颜色
  8. TanksWar(坦克大战三维、二维版以及90版)
  9. 【笔记】电商RFM模型
  10. 手机APP和PC站点接入中国银联支付