行为型模式:模板方法 1
LieBrother公众号原文:
行为型模式:模板方法
十一大行为型模式之一:模板方法。
简介
姓名 :模板方法
英文名 :Template Method Pattern
价值观 :在我的掌控下,任由你发挥
个人介绍 :
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(来自《设计模式之禅》)
解释一下上面的介绍,意思是由父类来定义框架,让子类来具体实现。
你要的故事
刚过完春节,大家都买新鞋了么?今天要讲的故事和鞋子有关。一双鞋子从表面来看,由鞋底、鞋垫、鞋面、鞋带组成,同一系列的鞋子这几个部分都是一样的,用同样的材料做出来,不同系列的鞋子就大相径庭了。根据模板方法模式,组装一双鞋子的制造过程可以归并为固定的框架,至于用什么材料,那由每个系列的鞋子去具体实现。我们先看定义组装鞋子的框架代码。
/*** 定义鞋子制造的工序框架*/
abstract class ShoeInstallTemplate {public abstract void installSole();public abstract void installInsole();public abstract void installVamp();public abstract void installShoelace();public void installShot(){System.out.println("组装一双鞋,步骤如下:");// 组装鞋底installSole();// 组装鞋垫installInsole();// 组装鞋面installVamp();// 组装鞋带installShoelace();}}
定义了一个组装鞋子框架的抽象类 ShoeInstallTemplate,里面有 4 个工序未具体实现,由鞋子制造商去实现,因为只有鞋子制造商才知道鞋子要用什么材料来做。
下面举 2 个比较出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分别实现这 2 个系列鞋子的制造代码。
/*** Adidas Boost 鞋制造*/
class AdidasBoostShoeInstall extends ShoeInstallTemplate {@Overridepublic void installSole() {System.out.println("组装白色 Boost 鞋底");}@Overridepublic void installInsole() {System.out.println("组装黑色 Boost 鞋垫");}@Overridepublic void installVamp() {System.out.println("组装黑色 Boost 鞋面");}@Overridepublic void installShoelace() {System.out.println("组装黑色 Boost 鞋带");}
}/*** Nike Jordan 鞋制造*/
class NikeJordanShoeInstall extends ShoeInstallTemplate {@Overridepublic void installSole() {System.out.println("组装黑色 Jordan 鞋底");}@Overridepublic void installInsole() {System.out.println("组装黑色 Jordan 鞋垫");}@Overridepublic void installVamp() {System.out.println("组装红色 Jordan 鞋面");}@Overridepublic void installShoelace() {System.out.println("组装红色 Jordan 鞋带");}
}
实现了制造商制造鞋子的代码之后,我们通过代码测试怎么制造 Boost 和 Jordan 鞋子。
public class TemplateMethodTest {public static void main(String[] args) {ShoeInstallTemplate adidasBoost = new AdidasBoostShoeInstall();adidasBoost.installShot();ShoeInstallTemplate nikeJordan = new NikeJordanShoeInstall();nikeJordan.installShot();}}打印结果:
组装一双鞋,步骤如下:
组装白色 Boost 鞋底
组装黑色 Boost 鞋垫
组装黑色 Boost 鞋面
组装黑色 Boost 鞋带组装一双鞋,步骤如下:
组装黑色 Jordan 鞋底
组装黑色 Jordan 鞋垫
组装红色 Jordan 鞋面
组装红色 Jordan 鞋带
模板方法模式就这么简单。是不是掌握了?
代码:
Template Method Pattern
总结
模板方法是一个比较实用的模式,为什么说实用呢?举个现实的例子,Java 能有如今的发展,离不开各大开源框架,比如 Dubbo,有看过源码的朋友就知道,里面大量代码运用了模板方法设计模式,为什么 Dubbo 可以支持很多种注册中心?其实本质就是用了模板方法设计模式,使得可以扩展多种注册中心。掌握好模板方法,对读源码有非常大的帮助,很多人包括我在内,在刚开始阅读源码的时候,有相当长的一段时间怀疑人生,怎么这些代码那么绕?调来调去的。当你了解了常用的设计模式之后,看源代码就可以直截了当的知道是用什么设计模式,为什么用这个设计模式?原来是为了什么什么。。。有了这层思考,就像有一条线将以前散落在各地的知识点连接起来,成了可以推敲的知识。
参考资料:《大话设计模式》、《设计模式之禅》
推荐阅读:
设计模式系列文章
希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号:LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。
行为型模式:模板方法 1相关推荐
- 设计模式-创建型模式-模板方法
设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...
- 《设计模式详解》行为型模式 - 模板方法模式
模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...
- 设计模式 — 行为型模式 — 模板方法模式
目录 文章目录 目录 模板方法模式 应用场景 代码示例 模板方法模式 模板方法模式,定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容: 在模 ...
- 行为型模式-模板方法模式
1.概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关. ...
- 4.16_template_method_行为型模式:模板方法模式
行为型模式 --- 模板方法模式 --- 内容:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中使子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤角色:1. 抽象类 (Abstract ...
- 设计模式03 行为型模式
行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎么相互协同共同完成单个对象都无法单独完成的任务,它设计算法于对象间职责的分配. 行为型模式分为类行为模式和对象行为模式 ...
- 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)
文章目录 前言 一.责任链模式定义 二.责任链模式结构 三.责任链高级应用 四.责任链模式优缺点 设计模式系列文章 结尾 前言 作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门 ...
- 设计模式其实很简单之行为型模式
关注公众号获取更多资料 设计模式- 行为型模式 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. 行为型模式是23中设计模式 ...
- 设计模式— 行为型模式
关注公众号获取更多资料 设计模式- 行为型模式 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. 行为型模式是23中设计模式 ...
- 行为型模式:模板方法
文章首发: 行为型模式:模板方法 十一大行为型模式之一:模板方法. 简介 姓名 :模板方法 英文名 :Template Method Pattern 价值观 :在我的掌控下,任由你发挥 个人介绍 : ...
最新文章
- 事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比
- Windows 8失败的5个原因
- 程振波 算法设计与分析_算法分析与设计之动态规划
- 安师大计算机与信息学院导师,安徽师范大学数学计算机科学学院导师介绍:罗永龙...
- 【CVPR2020 image caption】读Meshed-Memory Transformer for Image Captioning
- Mybatis中输入输出映射和动态Sql
- 玩转Citrix XenApp中的IE发布 (上)
- 《啊哈 C语言》读书笔记
- 计算机图书馆管理系统论文模板,基于Java的图书馆管理系统计算机科学与技术毕业设计(论文)...
- Linux系统分区概念
- 没有U盘纯硬盘安装linux之Ubuntu22.04
- 一文JDK动态代理的那点事儿
- jquery查子元素
- 模块划分-4 模块划分
- CIS crosstalk简介
- spring和hibernate的整合
- 实用有效!React项目中使用watermark.js添加水印效果
- QQ发表说说显示服务器超时,qq空间发表说说无法显示的原因
- java_Stream流和Optional
- element-ui中的el-table-column加v-if不生效,表头错乱
热门文章
- 彻底理解AMD和CMD
- docker from指令的含义_volume_from指令-docker撰写
- 江西瑞金计算机网络设计工资多少,瑞金java工资一般多少
- php手册中点击下载的功能,PHP实现文件下载功能
- java多线程实例_要把Java吃透您得先吃透这些基本概念
- 学会c语言开发出很多,学会了C语言可以开发出很多东西吗?
- 20200114:(leetcode)两数相加
- 查看 svn 中本地项目的版本
- 超强干货!AI、Python、机器学习课程免费学,请尽快领取!
- 中科院发布了目标追踪数据集,1万多条视频,150万个边界框 | 快来下载