设计模式 -- 模版模式
模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
介绍
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
步骤 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!
鸣谢:
TIJ
模板模式
转载于:https://www.cnblogs.com/ClassNotFoundException/p/8035077.html
设计模式 -- 模版模式相关推荐
- 设计模式 - 模版模式
文章目录 设计模式 - 模版模式 1.简述 2.创建模版 3.创建模版实现 4.使用模版运行 设计模式 - 模版模式 1.简述 模板模式属于行为型模式 一个抽象类公开定义了执行它的方法的方式/模板.它 ...
- 津津乐道设计模式 - 模版模式详解(以女友化妆流程带你彻底明白)
- Python设计模式之模版模式(16)
模版模式(The Template Pattern):抽象出算法公共部分从而实现代码复用. 模板模式中,我们可以把代码中重复的部分抽出来作为一个新的函数,把可变的部分作为函数参数,从而消除代码冗余.一 ...
- 设计模式 模版方法模式 展现程序员的一天
继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...
- 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)
0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...
- 关于设计模式的讨论(5)——模版模式(Templete)
今天想和大家分享的第五种设计模式就是--模版模式(Templete),闲话少叙,直接上干货. 模版模式(Template Pattern) 模版模式:模版模式是属于行为型模式,一个抽象类公开定义了执行 ...
- java设计模式_模版模式
2019独角兽企业重金招聘Python工程师标准>>> package com.wangbiao.test;/*** 模版模式,好比一个业务的流程一样,抽象类大致的设计了流程的步骤, ...
- java 设计模式学习笔记十四 template模版模式
/** * 模版 * * @time 下午09:58:00 * @author retacn yue * @Email zhenhuayue@sina.com */ public abs ...
- Java设计模式——模版方法模式
1.简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template ...
- java 设计模式之三-模版模式
新的一天,天气不错,坚持.努力.加油! 今天想说的是模版模式,其实这个模式大家都常用,只是可能不知道还有"模版模式"这么一个称呼而已,使用继承的方式来实现,父类为模版,子类根据不同 ...
最新文章
- 图片转字符 android,转字符图app下载-转字符图 安卓版v2.4-PC6安卓网
- 经典重温:卡尔曼滤波器介绍与理论分析
- 对于生活服务小公司网站的看法
- json为全局变量 vue_vue package.json设置全局变量
- python中的引用_Python中的引用
- 你不知道的Node.js性能优化,读了之后水平直线上升
- boost::graph模块使用write_graphviz 输出 BGL adjacency_list 的简单示例
- Ansible基本命令
- KDB支持单步调试功能(ARM架构)
- 论文html5的英文文献,html论文英文参考文献(优质论文108个).pdf
- 部署knight项目
- 微信/聊天宝/马桶MT/多闪 社交APP一个不落 被约谈!
- 前端系统化学习【JS篇】:(四-3)基本数据类型之Boolean篇
- 清华大学计算机系本科自考,清华大学自考专业有哪些
- 图解机器学习算法(14) | PCA降维算法详解(机器学习通关指南·完结)
- 基于区块链技术的展望:搭建商业银行供应链管理和供应链金融服务平台
- HbuilderX未检测到手机或模拟器
- 基于springboot的paypal支付demo
- linux s5pc100串口驱动,FS_S5PC100平台linux摄像头驱动开发详解
- vcs import src < ros2.repos 或 vcs import --input ros2.repos src 下载失败或速度慢
热门文章
- 经典公司小型局域网服务器架设方案
- cocos creator基础-(五)cc.Component使用
- Django之ModelForm使用
- 【bzoj3676】
- struts2入门之action获取表单提交数据
- kafka 小案例【二】 --kafka 设置多个消费着集群
- (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.conf、/var/named)设置实现和解释...
- POJ 3084 Panic Room (最小割建模)
- 【排序算法】堆排序——常规方法
- 爬取豌豆荚app数据(总结篇)