前言

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

模板方法模式

概念介绍

模板方法模式,其实是很好理解的,具体理解为,定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法结构即可冲定义该算法的某些特定步骤。模板方法模式是最为常见的设计模式之一,是基于继承的代码复用技术。架构师定义一套骨架,开发工程师按照骨架去实现具体的逻辑。

举例

在具体的项目中其实使用模板方法的场景有很多,就举我之间遇到过的一个场景吧,这是一个实际的项目,结合这个项目的中的场景可以引出模板方法模式的使用方法,

在一个审批流程的项目,会有很多种的申请单,例如:出差申请单、请假申请单、采购申请单、付款申请单等等。每个申请单在提交的时候都要先校验申请单的参数是否正确,以及在提交成功后去通知审批人,有待审批的单子了。所以说,这个过程都是一样的,只不过是,每个申请单的校验参数以及通知审批人的方法会有所不同。那么这样就可以把这个提交的过程定义成一个模板,然后每个审批单的都按照这个流程来进行提交申请就可以了。

具体代码实现如下:

流程模板类

/*** 流程模板类*/
public abstract class BaseProcess {/*** 提交流程*/public void submitProcess(Map<String,String> paramMap){boolean checkResult = checkParameter(paramMap);if(checkResult){System.out.println("提交流程成功!");remindApprovers();}else {System.out.println("提交流程失败!");}}/*** 校验参数* @return*/public abstract boolean checkParameter(Map<String,String> paramMap);/*** 提醒审批人*/public abstract void remindApprovers();
}

差旅审批流程

/*** 差旅审批流程**/
public class BusinessTravelProcess extends BaseProcess{/*** 校验参数** @return*/@Overridepublic boolean checkParameter(Map<String,String> paramMap) {if(null!=paramMap.get("result")&&paramMap.get("result").equals("true")){System.out.println("差旅审批单参数校验成功!");return true;}else {System.out.println("差旅审批单参数校验失败!");return false;}}/*** 提醒审批人*/@Overridepublic void remindApprovers() {System.out.println("有新的差旅申请提交了。");}
}

请假审批流程

/*** 请假审批流程*/
public class LeaveApplyProcess extends BaseProcess {/*** 校验参数** @return*/@Overridepublic boolean checkParameter(Map<String,String> paramMap) {if(null!=paramMap.get("result")&&paramMap.get("result").equals("true")){System.out.println("请假审批单参数校验成功!");return true;}else {System.out.println("请假审批单参数校验成功!");return false;}}/*** 提醒审批人*/@Overridepublic void remindApprovers() {System.out.println("有新的请假申请提交了。");}
}

测试类

public class Client {public static void main(String[] args) {//创建请假申请单BaseProcess leaveApply = new LeaveApplyProcess();Map<String,String> paramMap = Maps.newHashMap();paramMap.put("result","true");//提交采购申请单
        leaveApply.submitProcess(paramMap);//创建差旅申请单BaseProcess business = new BusinessTravelProcess();paramMap = Maps.newHashMap();paramMap.put("result","false");//提交差旅申请单
        business.submitProcess(paramMap);}}

运行结果

请假审批单参数校验成功!
提交流程成功!
有新的请假申请提交了。
差旅审批单参数校验失败!
提交流程失败!

上面的这个例子就是使用的模板方法模式,这个场景是一些业务功能,大体框架是固定的,只是一些具体的实现细节可能不同。用模板方法能提高代码的复用性和系统的灵活性。

结构分析

下面来分析一下模板方法的具体结构组成,如下是模板方法模式的类图。

模板方法模式中,具体就两个角色。

1、AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。

2、ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

但是模板方法模式的实现是离不开这三个方法的

1、基本方法

基本方法也称为基本操作,是由子类实现的方法,并且在模板方法中被调用。

2、模板方法

模板方法可以有一个或几个,一般是一个具体的方法,也就是一个骨架,实现对基本方法的调度,完成固定的逻辑。为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。

3、钩子方法

钩子方法由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法,来影响模板方法的逻辑。抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定。

总结

模板方法模式是基于继承的代码复用技术,它体现了面向对象的诸多重要思想,是一种使用较为频繁的模式。模板方法模式广泛应用于框架设计中,以确保通过父类来控制处理流程的逻辑顺序(如框架的初始化,测试流程的设置等)。

主要优点

1、在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。

2、模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当使用继承来实现代码复用。

3、可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。

4、在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

主要缺点

1、需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,也可结合桥接模式来进行设计。

2、由于每个子类的方法会影响到了父类,这里违反了里氏替换原则,会给程序带来风险。

适用场景

1、对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。

2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

3、需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

想了解更多的设计模式请查看Java设计模式学习记录-GoF设计模式概述。

转载于:https://www.cnblogs.com/jimoer/p/9726934.html

Java设计模式学习记录-模板方法模式相关推荐

  1. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  2. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  3. 【一】Java 设计模式学习记录: 工厂模式

    文章目录 一.设计模式的分类 二.工厂模式 2.1 简单工厂模式 2.1.1 解决的问题 2.1.2 简单工厂模式是什么 2.1.3 优缺点 2.2 工厂方法模式 2.2.1 解决的问题 2.2.2工 ...

  4. Java设计模式学习记录-单例模式

    前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...

  5. Java设计模式系列之——模板方法模式

    大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...

  6. Java设计模式9,模板方法模式

    目录 一.模板方法模式 二.模板方法模式的结构 三.模板方法模式的优缺点 1.优点 2.缺点 四.模板方法模式的使用场景 五.通过模板方法模式实现 抽象类WorkDay 1.顶级抽象类 2.项目经理的 ...

  7. 设计模式学习(八) 模板方法模式

    引入 定义:在一个方法中定义了一个算法的骨架,而将一些一些步骤延迟到子类中.模板方法使得子类可以在不改变算法接口的情况下,重新定义算法中的某些步骤. uml类图 这个模式是用来创建一个算法的模板,什么 ...

  8. 【三】Java 设计模式学习记录:观察者模式

    文章目录 一.观察者模式(行为型模式) 1.1 场景 1.2 普通解决方案 1.3 观察者模式定义 1.4 观察者模式原理 二.代码实现 2.1 代码结构 2.2 上代码 2.3 扩展性 三. 框架应 ...

  9. javascript设计模式学习日记--模板方法模式

    模板方法模式: 把相似的流程抽象出来作为一个父类,来封装好子类的算法框架,然后子类继承这个父类,并且可以重写非公有的方法,来实现自己的业务逻辑. 聚个栗子 泡茶泡咖啡是很好的例子,不同企业的面试流程也 ...

  10. Java设计模式学习之工厂模式

    简单工厂模式 我直接上代码代码里有很详细的注解 //简单工厂模式 是由一个工厂对象决定创建出哪种产品 class Factory1 {publicstatic void main(String[] a ...

最新文章

  1. 数据科学家:那些年,我都学过哪些编程语言…
  2. 常用组策略故障排除工具
  3. 一个用于 Entity Framework 对象拷贝的方法
  4. 青少年计算机学奥林匹克大赛,2019年第36届全国青少年信息学奥林匹克竞赛获奖规则...
  5. [转载] WSDL2Java详细使用说明【官方最全说明】
  6. Android MediaRecorder录制视频提示start failed的解决办法
  7. vue状态管理存取数据_Vue中的数据通信和状态管理
  8. parse Json
  9. php url地址栏传中文乱码解决方法集合
  10. C语言的文件读取------C语言
  11. linux下安装jemalloc
  12. Java摇骰子比大小_android 摇骰子比大小app源码
  13. 生产计划排程APS系统整体结构
  14. 优衣库46万客户信息遭泄露,这些年,你的信息还被谁泄露过?
  15. 数据库和数据仓库联系和区别
  16. 还不好好读书吗?清华3D录取通知书出炉,还能动!
  17. 超硬核!兔兔阿里p7学长给的面试知识库
  18. 使用机器学习预测大盘
  19. python3视频教学百度云盘_Python3自学基础到入门视频教程[百度云盘]
  20. ARM-translation table walk

热门文章

  1. 91.v6p.co index.php,海洋cms V6.61
  2. Java性能优化之for循环
  3. Android 测试点归纳总结
  4. 用python批量下载modis数据的速度怎么样_MODIS数据下载与处理-pymodis的使用(持续更新...)...
  5. C++实现求解完美数算法
  6. docker视频教程 假装听听 应该还行
  7. 51单片机(一)—— 51单片机简介
  8. 最简单的在IntelliJ IDEA导入一个本地项目教程
  9. IDEA导入本地项目
  10. Ps中的图片如何在手机上在线预览