【设计模式】第十三章:模板方法模式详解及应用案例
系列文章
【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式
文章目录
- 系列文章
- 一、定义
- 二、角色分类
- 三、实现方式
- UML图
- 具体实现
- 四、应用场景
- 五、优缺点
- **优点**
- 缺点
一、定义
摘自百度百科: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
二、角色分类
抽象类(Abstract Class)
定义了一系列的基本操作,这些具体操作可以是具体的,也可以是抽象的,每一个基本操作都对着算法的一个步骤,在其子类中可以重写或实现这些步骤。同时,在抽象类中实现了一个模板方法,用来定义一个算法的框架,模板方法不仅可以调用抽象类中实现的基本方法,可以调用抽象类的子类中实现的基本方法和其他对象中的方法
具体子类(Concrete Class)
它是抽象类的子类,用于实现在父类中声明的抽象操作,以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的步骤
客户角色(Client)
具体调用方法的角色
三、实现方式
UML图
具体实现
我们以入住酒店为例,我们先定义一个抽象类CheckIn,用它来定义我们入住的具体流程
抽象类角色(Abstract Class)
public abstract class CheckInHotel {protected final void CheckInProcess() {// 选择酒店this.chooseHotel();// 验证身份this.verifyIdentity();// 给钱this.pay();// 入住this.checkIn();}protected void verifyIdentity() {System.out.println("掏出身份证验证身份");}protected void checkIn() {System.out.println("入住酒店了");}protected abstract void chooseHotel();protected abstract void pay();
}
具体子类(Concrete Class)
public class FirstChoice extends CheckInHotel {@Overrideprotected void chooseHotel() {System.out.println("选择酒店一");}@Overrideprotected void pay() {System.out.println("使用支付宝支付");}
}public class SecondChoice extends CheckInHotel {@Overrideprotected void chooseHotel() {System.out.println("选择酒店二");}@Overrideprotected void pay() {System.out.println("使用微信支付");}
}
客户角色(Client)
public class Client {public static void main(String[] main) {FirstChoice first = new new FirstChoice();first.checkInProcess();SecondChoice second = new new SecondChoice();second.checkInProcess();}
}
运行结果
选择酒店一
掏出身份证验证身份
使用支付宝支付
入住酒店了选择酒店二
掏出身份证验证身份
使用微信支付
入住酒店了
四、应用场景
以下部分内容摘自菜鸟教程
意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决: 一些方法通用,却在每一个子类都重新写了这一方法。
何时使用: 有一些通用的方法。
如何解决: 将这些通用算法抽象出来。
关键代码: 在抽象类实现,其他步骤在子类实现。
应用实例:
- 在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
- 西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
- spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
使用场景:
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
**注意事项:**为防止恶意操作,一般模板方法都加上 final 关键词。
五、优缺点
优点
- 封装不变部分,扩展可变部分。
- 提取公共代码,便于维护。
- 行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
【设计模式】第十三章:模板方法模式详解及应用案例相关推荐
- 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...
- 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...
- 设计模式之模板方法模式详解
设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...
- 设计模式(五)——建造者模式详解
设计模式(五)--建造者模式详解 概述 结构 代码案例 优缺点 使用场景 模式扩展 创建者模式对比 工厂方法模式和建造者模式 抽象工厂模式和建造者模式 概述 建造者模式就是说将一个复杂对象的构建和表示 ...
- 设计模式(四)——原型模式详解
设计模式(四)--原型模式详解 定义 结构 实现 案例 浅克隆 深克隆 定义 原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含以下角色: ...
- (九)模板方法模式详解(包含与类加载器不得不说的故事)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 模板方法模式,这是一个在许多 ...
- 从java多态到策略模式_设计模式中的多态——策略模式详解
2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...
- Java设计模式-模板方法模式详解
Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...
- 【设计模式】之抽象工厂模式详解与应用(三)
开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...
最新文章
- java setmnemonic_java – 关于setMnemonic的一些问题
- 【牛客 - 125A】灰魔法师(打表,暴力)
- 灵魂发明家自述:我就是靠这个创业成功的
- android 通知打开app,Android打开通知栏并回到主页的几种方式
- java命令添加classpath_java和javac命令的classpath用法
- grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won’t be
- MaxCompute SQL中的更新和删除如何实现
- php.ini 中开启短标签 ?=$?
- weui 加载提示_WeUI与WeUI.JS配合切换进入页面显示加载动画
- 海森矩阵的特征值和特征向量的物理意义推导
- java开发随记之 Invalidate Caches / Restart
- 数字翻译器,Java
- Python(高级FTP作业)
- iPhone苹果手机支付宝App Store消费红包怎么使用?
- 【赶紧收藏】福利:Python全国计算机二级等级考试题库免费送!!!!
- 研究生平均年薪26.5万!本科生20万!南京大学软件学院19年就这么高!
- 爱心信封打开ui动画特效
- 哪家互联网大厂,对离职员工最“狠”?
- Linux--Linux服务器空间占满解决办法
- grafana 使用指南 —— geomap 地图组件