设计模式笔记二十四:模板模式
原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论(本文大部分转自原文)
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:
一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:
有一些通用的方法,把这些方法集中在一个父类中,让需要实现这些方法的类都extends这个父类
如何解决:
将这些通用算法抽象出来。
关键代码:
在抽象类实现,其他步骤在子类实现。
应用实例:
1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
3、Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:
为防止恶意操作,一般模板方法都加上 final 关键词。
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
模板模式的 UML 图
步骤 1
创建一个抽象类,它的模板方法被设置为 final。
Game.java
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
步骤 2
创建扩展了上述类的实体类。
Cricket.java
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}
Football.java
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}
步骤 3
使用 Game 的模板方法 play() 来演示游戏的定义方式。
TemplatePatternDemo.java
public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play(); }
}
步骤 4
验证输出。
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
小结:
模板方法:抽象出共性放在父类,继承后在子类重写这些方法。
设计模式笔记二十四:模板模式相关推荐
- 设计模式笔记之十四 (命令模式)
命令模式 命令模式是一种比较容易理解的设计模式,顾名思义,就是调用者发一个命令,有人给做完就行了,无关乎怎么做,也无关乎谁做. 我们继续我们以往的方式:理论联系实践的方式来理解命令模式. 最近我们实验 ...
- 云计算设计模式(二十四)——仆人键模式
云计算设计模式(二十四)--仆人键模式 使用一个令牌或密钥,向客户提供受限制的直接訪问特定的资源或服务,以便由应用程序代码卸载数据传输操作. 这个模式是在使用云托管的存储系统或队列的应用中特别实用,而 ...
- 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)
你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...
- C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例 ...
- 【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章学习了保护模式下的任务与任务隔离,以及简单介绍了保护模式下 ...
- 【OS学习笔记】十四 保护模式二:段描述符
上一篇文章初步进入保护模式的学习.首先学习了全局描述符表GDT.点击链接查看上一篇文章:全局描述符表 本篇文章继续学习,GDT中存放的条目:描述符,确切的说是段描述符.学习段描述符的作用以及段描述符的 ...
- 设计模式笔记二十五:访问者模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. (本文多摘自原文,对于访问者模式的作用还是有些不是很明白,这篇文章貌似比 ...
- 设计模式笔记二十二:空对象模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 在空对象模式(Null Object Pattern)中,一个空对象取代 ...
- 设计模式(二十四)解释器模式
#1 场景问题# ##1.1 读取配置文件## 考虑这样一个实际的应用,维护系统自定义的配置文件. 几乎每个实际的应用系统都有与应用自身相关的配置文件,这个配置文件是由开发人员根据需要自定义的,系统运 ...
最新文章
- 杨学海:跨境电商新通道-进口保税直邮模式解析
- 6,ORM组件XCode(撬动千万级数据)
- HtmlUnit动态执行js函数
- 使用python3 解析html对称标签
- 如何判断SAP CDS view的association是inner join还是outer join实现的
- PowerBuilder调用.Net编译好的DLL
- MySQL之Handler_read_*查看索引使用情况
- LREC'22 | 机器翻译中细粒度领域自适应的数据集和基准实验
- Docker网络实践运用
- Il2CppDumper的使用方法,ILSpy中文版的下载地址
- 基于SSM实现酒店入住预定管理系统
- SAAS PASS IASS 理解
- linux桌面图标大小,ubuntu17.10修改桌面图标大小的方法
- OMG,学它!java定时器quartz表达式
- 全相等函数 isEqual
- 电脑不小心删除文件如何找回?你还不知道这3个小技巧?
- 解决RequestMapping写在类上页面跳转失败
- 办公室最经常用到的WIFI ip地址设置(window10)
- fastapi服务部署
- PostgreSQL 源码解读(216)- 实现简单的扩展函数
热门文章
- Linux. C语言中else,2. if/else语句
- Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.4.4 延迟初始化的bean...
- 轻量级数据sqlite的C++调用示例
- POI中设置Excel单元格格式
- android 方法统计,Android 利用编译时 注入 统计App内所有方法执行时常,分析ANR
- Win10+CUDA10.0.130+cudnn7.4.1+tensorflow1.13.1+anaconda3 5.2.0+GTX1060
- autodock tool文件_理解autodock分子对接思路和流程--系列导读
- PAT乙级(1024 科学计数法)
- 基础知识—数据类型-数据类型
- mysql 403_mysql数据库管理phpmyadmin 403错误的解决方法