【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录
- 一、模板方法模式简介
- 二、模板方法模式适用场景
- 三、模板方法模式优缺点
- 四、模板方法扩展
- 五、模板方法模式相关设计模式
- 六、模板方法模式代码示例
- 1、模板方法抽象类
- 2、模板方法实现类 1
- 3、模板方法实现类 2
- 4、测试类
一、模板方法模式简介
模板方法模式 : 定义了一个 算法 的 骨架 , 并允许 子类 为 一个或多个 步骤 提供实现 ;
模板方法模式 可以使 子类 在不改变 算法结构 的前提下 , 重新定义算法的某些步骤 ;
模板方法模式类型 : 行为型 ;
二、模板方法模式适用场景
模板方法模式适用场景 :
- 父类视角 : 一次性 实现 一个算法 不变的部分 , 并将 可变部分 留给 子类 实现 ;
- 子类视角 : 各个子类中 , 公共部分 被提取出来 , 集中到一个公共的父类中 , 避免代码重复 ;
模板方法模式的目的是 让 子类可以扩展 或 具体实现固定方法的某个具体的步骤 ; 对于模板来说 , 是一套固定的算法 , 通过子类 可以扩展 固定算法中某些算法步骤 ;
三、模板方法模式优缺点
模板方法模式优点 :
提高代码复用性 : 将 相同部分代码 , 放在抽象的父类中 ;
提高扩展型 : 将 不同的代码 , 放在不同的子类中 , 通过对子类的扩展 , 增加新的行为 ;
符合开闭原则 : 通过 父类 调用 子类的操作 , 通过 对子类的扩展 来 增加新的行为 ;
模板方法模式 将 不变的行为定义在父类中 , 去除子类的重复代码 , 体现其优势 , 提供了一个很好的代码复用平台 ;
模板方法模式缺点 :
增加复杂性 : 类 数量增加 , 增加了系统复杂性 ; 引入了抽象类 , 对于每个实现 , 都需要定义一个子类 ;
继承缺点 : 模板方法 主要 通过 继承实现 , 继承关系自身就有缺点 , 如果父类增加新的抽象方法 , 所有的子类都要修改一遍 ;
四、模板方法扩展
模板方法扩展 : 通过 钩子方法进行扩展 ;
- 钩子方法 : 提供缺省的行为 , 子类可以在必要时进行扩展 ;
钩子方法 是 模板对子类更进一步开方和扩展 ;
五、模板方法模式相关设计模式
模板方法模式与工厂方法模式 : 工厂方法 是 模板方法的一种特殊实现 ;
模板方法模式和策略模式 : 二者都 封装了算法逻辑 ;
策略模式 的目的是 使 各种算法 之间可以 相互替换 , 并且不影响最终用户的使用 , 对终端用户透明 ;
模板方法模式 是针对 一个算法流程 , 将其中某些不太一样的算法步骤 , 交给子类实现 ,
模板方法模式不会改变算法流程 , 策略模式是可以改变算法流程的 , 并且策略模式的策略之间可以相互替换 ;
六、模板方法模式代码示例
业务场景 : 把大象放进冰箱 ;
1、模板方法抽象类
package templatemethod;public abstract class Fridge {/*** 模板方法 不能被修改 , 使用 final 修饰 , 不允许子类覆盖该方法* 防止子类修改模板方法的流程*/protected final void store() {openDoor();closeDoor();// 这个钩子方法可以让子类控制模板方法的执行流程if (needColdStorage()) {codeStorage();}put();}/*** 该方法是不变的 , 不允许子类修改*/final void openDoor() {System.out.println("打开冰箱门");}final void codeStorage() {System.out.println("打开冷藏功能");}/*** 钩子方法 , 子类可以进行覆盖* 将适当的权限开放给应用层 , 用于控制模板方法流程* @return*/protected boolean needColdStorage() {return false;}/*** 抽象方法 , 需要子类进行实现*/abstract void put();final void closeDoor() {System.out.println("关闭冰箱门");}
}
2、模板方法实现类 1
注意这个类 实现了 钩子方法 , 改变了模板方法的执行流程 ;
package templatemethod;public class FishFridge extends Fridge {@Overridevoid put() {System.out.println("把鱼放进冰箱");}@Overrideprotected boolean needColdStorage() {// 需要冷藏存储return true;}
}
3、模板方法实现类 2
package templatemethod;public class ElephantFridge extends Fridge {@Overridevoid put() {System.out.println("把大象放进冰箱");}
}
4、测试类
package templatemethod;public class Main {public static void main(String[] args) {// 把大象放到冰箱Fridge elephantFridge = new ElephantFridge();elephantFridge.store();System.out.println();// 把鱼放到冰箱Fridge fishFridge = new FishFridge();fishFridge.store();}
}
执行结果 :
打开冰箱门
关闭冰箱门
把大象放进冰箱打开冰箱门
关闭冰箱门
冷藏存放
把鱼放进冰箱
【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )相关推荐
- 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...
- 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...
- 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.状态模式简介 二.状态模式适用场景 三.状态模式优缺点 四.状态模式相关设计模式 五.状态模式代码示例 1.状态类父类 2.播放状态类 3.暂停状态类 4.快进状态类 5.停止状态类 6 ...
- 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...
- 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.桥接模式简介 二.桥接模式适用场景 三.桥接模式优缺点 四.桥接模式相关设计模式 五.桥接模式代码示例 1.视频格式抽象 2.FLV 视频格式实现 3.MP4 视频格式实现 4.系统平台 ...
- 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.工厂方法模式简介 二.工厂方法模式适用场景 三.工厂方法模式优缺点 四.工厂方法模式代码示例 1.产品抽象类 2.产品实现类 1 3.产品实现类 2 4.抽象工厂类 5.实现工厂类 1 ...
- 【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.解释器模式简介 二.解释器模式适用场景 三.解释器模式优缺点 四.解释器模式与适配器模式 五.解释器模式代码示例 1.解释器接口 2.加法解释器 3.乘法解释器 4.整型解释器 5.语法 ...
- 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...
- 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...
最新文章
- DHCP Server 故障转移实现 (结合H3C交换机)
- 深入理解RMQ LCA
- MASH结构相噪分析的simulink仿真
- Ubuntu 9.0 下之HBase 0.90.4 的安装和使用
- 【视图】ABAP Views
- 1024程序员节 | 我在腾讯自研数据库,我为技术代言
- 你应该知道的 Linux 命令行技巧
- 设置linearlayout最大高度_ICEM CFD网格设置参数意义
- vue中页面跳转传值_vue 页面跳转传参
- matlab2c使用c++实现matlab函数系列教程-intersect函数
- givemesomecredit数据_EasyEnsemble:一种简单的不平衡数据的建模方法(附测试代码)...
- UIKit should not be called from a secondary thread.
- 【深入浅出通信原理-学习笔记】复用和多址技术
- mysql数据库管理与开发pdf_深入浅出mysql数据库开发、优化与管理维护.pdf
- Oracle for update skip locked 详解
- 2021年茶艺师(中级)复审考试及茶艺师(中级)模拟考试题
- android电商平台,基于Android的电商平台通用客户端的设计与实现
- C#调用存储过程带输出参数或返回值分类(转)
- ESP32 串口读取 jy901s 姿态传感器
- cmd打开常用设置以及应用的快捷方法