模板设计模式_23种设计模式之模板设计模式
基本介绍
1.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的模板。它的子类可以俺需要重写方法实现,但调用将以抽象类中定义的方式进行;
2.简单说,模板方法模式定义一个操作中的算法的骨架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤;
3.这些类型的设计模式属于行为型模式。
原理类图
角色及职责
模板模式主要是由抽象模板(Abstarct Template)角色和具体的模板(Concrete Template)角色组成。
1.抽象模板(Abstract Template): 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤;定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
2.具体模板(Concrete Template): 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
代码
以下将以不同事务放入冰箱为例
冰箱类
/** * 冰箱抽象类 * * @author Api * @DATA 2020/3/24 1:08 */public abstract class Refrigerator { //把物品放入冰箱仅需要三步,第一步打开冰箱门,第二步把物品放进去,第三步关闭冰箱门 //必须定义为final,不允许子类进行重写 final void operating() { openDoor(); putInto(); close(); } //第一步打开冰箱门 private void openDoor() { System.out.println("打开冰箱门"); } //第二步把物品放入进冰箱 abstract void putInto(); //第三步关闭冰箱门 private void close() { System.out.println("关闭冰箱门"); }}
大象具体实现类
/** * 大象,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Elephant extends Refrigerator { @Override void putInto() { System.out.println("把大象放进去"); }}
猪具体实现类
/** * 猪,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Pig extends Refrigerator{ @Override void putInto() { System.out.println("把猪放进去"); }}
测试类
/** * 测试类 * * @author Api * @DATA 2020/3/24 1:07 */public class Client { public static void main(String[] args) { Refrigerator pig = new Pig(); pig.operating(); System.out.println("----------------------------------"); Refrigerator elephant = new Elephant(); elephant.operating(); }}
执行结果为
打开冰箱门把猪放进去关闭冰箱门----------------------------------打开冰箱门把大象放进去关闭冰箱门
钩子方法
在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事情,子类可以视情况要不要覆盖,该方法称为"钩子"。
代码
上述案例把猪和大象放入了冰箱,此时,我需要看一下它们的状况,并且不关冰箱门,步骤将忽略第二步和第三步
冰箱抽象类
/** * 冰箱抽象类 * * @author Api * @DATA 2020/3/24 1:08 */public abstract class Refrigerator { //把物品放入冰箱仅需要三步,第一步打开冰箱门,第二步把物品放进去,第三步关闭冰箱门 //必须定义为final,不允许子类进行重写 final void operating() { openDoor(); putInto(); if (hook()) { close(); } } //第一步打开冰箱门 private void openDoor() { System.out.println("打开冰箱门"); } //第二步把物品放入进冰箱 abstract void putInto(); //第三步关闭冰箱门 private void close() { System.out.println("关闭冰箱门"); } //钩子方法,决定是否关闭冰箱门 public boolean hook() { return true; }}
具体的实现子类
/** * 大象,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Elephant extends Refrigerator { @Override void putInto() { System.out.println("把大象放进去"); }}
具体的实现子类
/** * 猪,具体的实现子类 * * @author Api * @DATA 2020/3/24 1:07 */public class Pig extends Refrigerator { @Override void putInto() { System.out.println("把猪放进去"); }}
具体的实现子类
/** * 打卡冰箱门,不干任何事 * @author Api * @DATA 2020/3/24 1:31 */public class Watch extends Refrigerator { //空实现 @Override void putInto() { } @Override public boolean hook() { return false; }}
测试类
/** * 测试类 * * @author Api * @DATA 2020/3/24 1:07 */public class Client { public static void main(String[] args) { Refrigerator pig = new Pig(); pig.operating(); System.out.println("----------------------------------"); Refrigerator elephant = new Elephant(); elephant.operating(); System.out.println("----------------------------------"); //仅打开冰箱门,不放事物,不关冰箱门 Refrigerator watch = new Watch(); watch.operating(); }}
执行结果
打开冰箱门把猪放进去关闭冰箱门----------------------------------打开冰箱门把大象放进去关闭冰箱门----------------------------------打开冰箱门
优缺点
优点
1.扩展性好,对不变的代码进行封装,对可变的进行扩展;
2.可维护性好,因为将公共代码进行了提取,使用的时候直接调用即可。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂。
使用场景
1.有多个子类共有逻辑相同的方法;
2.重要的、复杂的方法,可以考虑作为模板方法。
注意事项
为防止恶意操作,一般模板方法都加上 final 关键词!
模板设计模式_23种设计模式之模板设计模式相关推荐
- Java两种设计模式_23种设计模式(11)java策略模式
23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...
- java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式
抽象工厂模式的适用: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想 ...
- 23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式。
23种设计模式,今天来聊聊模板模式,工厂方法模式,单例模式. 1. 随处可见的模板模式 2. 暗含讲究的工厂方法模式 3. 单例模式隐含的坑你能看到第几层? 视频讲解如下,点击观看: [干货篇]23种 ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- 五种常见的 PHP 设计模式
设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 "四人 ...
- 五种常见的PHP设计模式
2019独角兽企业重金招聘Python工程师标准>>> 五种常见的PHP设计模式 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm ...
- 模板方法设计模式两种实现方案
目录 1.模板方法设计模式 2.继承实现方案 3.依赖实现方案 3.1 spring-jdbc 中的 JdbcTemplate 3.2 阿里分布式事务框架Seata中的ExecuteTemplate ...
- python 设计模式 23种_python实现23种设计模式
本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>--吴强 <Py ...
- 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...
最新文章
- stdio.h头文件中申明的基本函数
- 了解下RDF 都柏林核心元数据
- 如何下载指定版本的torchtext
- 3w最简单led灯电路图_12v延时关闭电路图大全
- Jquery判断元素是否隐藏:display属性状态值
- 软考网络工程师学习笔记4-局域网与城域网
- quartz的负载均衡
- Java Thread等待,通知和notifyAll示例
- 表单验证神器——jquery.validate插件
- linux怎样使用小米线刷工具,小米线刷工具推荐及使用教程
- 杭电OJ刷题指南(ACM)
- 芝麻授权 java调用_手机浏览器怎么调用支付宝进行用户授权呢?
- 麒麟Linux启动目录,优麒麟目录结构介绍 系统入门必备
- 服务器被黑客入侵了怎么办?
- 华人科学家量子计算机,华人科学家张首晟辞世 有望获得诺贝尔奖却成遗憾
- Python生成验证码图片及验证用户提交的验证码是否正确
- ElementUI之el-pagination样式修改(小三角、“前往”、页码数)
- 用原生JS和CSS3做一个有趣的cube相册
- SAP License:SAP常见问题与解决办法(汇总帖)
- 【后续还会补充】Sublime Text 4 常用插件安装及配置方法
热门文章
- AngularJ控制器
- JAVA 反射 动态获取类,并调用方法
- Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
- PowerDesigner模型设计1
- 微软Windows2003的正版安装序列号
- Android对话框的高级设置《二》设置对话框按钮的透明度和对话框的在屏幕上的显示位置
- 编译报错:make: *** No rule to make target (例如:starg.h)解决
- Ubuntu18.04之搜狗输入法
- Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据
- Sensor 代码流程分析