行为型模式:模板方法
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 { @Override public void installSole() { System.out.println("组装白色 Boost 鞋底"); } @Override public void installInsole() { System.out.println("组装黑色 Boost 鞋垫"); } @Override public void installVamp() { System.out.println("组装黑色 Boost 鞋面"); } @Override public void installShoelace() { System.out.println("组装黑色 Boost 鞋带"); } } /** * Nike Jordan 鞋制造 */ class NikeJordanShoeInstall extends ShoeInstallTemplate { @Override public void installSole() { System.out.println("组装黑色 Jordan 鞋底"); } @Override public void installInsole() { System.out.println("组装黑色 Jordan 鞋垫"); } @Override public void installVamp() { System.out.println("组装红色 Jordan 鞋面"); } @Override public 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 鞋带
模板方法模式就这么简单。是不是掌握了?
总结
模板方法是一个比较实用的模式,为什么说实用呢?举个现实的例子,Java 能有如今的发展,离不开各大开源框架,比如 Dubbo,有看过源码的朋友就知道,里面大量代码运用了模板方法设计模式,为什么 Dubbo 可以支持很多种注册中心?其实本质就是用了模板方法设计模式,使得可以扩展多种注册中心。掌握好模板方法,对读源码有非常大的帮助,很多人包括我在内,在刚开始阅读源码的时候,有相当长的一段时间怀疑人生,怎么这些代码那么绕?调来调去的。当你了解了常用的设计模式之后,看源代码就可以直截了当的知道是用什么设计模式,为什么用这个设计模式?原来是为了什么什么。。。有了这层思考,就像有一条线将以前散落在各地的知识点连接起来,成了可以推敲的知识。
参考资料:《大话设计模式》、《设计模式之禅》
推荐阅读:
希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号:LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深入解析Vue 和微信小程序的区别、比较
写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别。 一、生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多。 vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩子并不一样。 onLoad:页面加载 一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数。 onShow:页面显示 每次打开页面都会调用一次。 onReady:页面初次渲染完成 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。 对界面的设置如 wx.setNavigationBarTitle请在 onReady之后设置。详见生命周期。 onHide:页面隐藏 当 navigateTo或底部tab切换时调用。 onUnload:页面卸载 当 redirectTo或 navigateBack的时候调用。 数据请求 在页面加载请求数据时,两者钩子的使用有些类似,vue一般会在 created或者 mounted中请求数据,而在小程序,会在 onLoad或者 ...
- 下一篇
Synchronized锁在Spring事务管理下,为啥还线程不安全?
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 大年初二,朋友问了我一个技术的问题(朋友实在是好学,佩服!) 该问题来源知乎(synchronized锁问题): https://www.zhihu.com/question/277812143 开启10000个线程,每个线程给员工表的money字段【初始值是0】加1,没有使用悲观锁和乐观锁,但是在业务层方法上加了synchronized关键字,问题是代码执行完毕后数据库中的money 字段不是10000,而是小于10000 问题出在哪里? Service层代码: SQL代码(没有加悲观/乐观锁): 用1000个线程跑代码: 简单来说:多线程跑一个使用synchronized关键字修饰的方法,方法内操作的是数据库,按正常逻辑应该最终的值是1000,但经过多次测试,结果是低于1000。这是为什么呢? 一、我的思考 既然测试出来的结果是低于1000,那说明这段代码不是线程安全的。不是线程安全的,那问题出现在哪呢?众所周知,synchronize...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2配置默认Tomcat设置,开启更多高级功能