从西天取经的九九八十一难来看Java设计模式:模板方法模式
示例
当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤,
但一些步骤,不同的子类有不同的行为时,我们该如何来设计该类?
下面以玩王者荣耀为例展开学习:
玩游戏首先需要初始化游戏,然后加载地图、加载角色、然后才能开始游戏,最后结束游戏
定义一个Game类:
public abstract class Game {
public final void play () {
initialize();
loadMap();
loadRole();
startPlay();
endPlay();
}
/** 初始化游戏 */
protected abstract void initialize();
/** 加载地图 */
protected abstract void loadMap();
/** 加载角色 */
protected abstract void loadRole();
/** 开始游戏 */
protected abstract void startPlay();
/** 结束游戏 */
protected abstract void endPlay();
}
上面类的实现类:
public class KingGlory extends Game {
@Override
protected void initialize() {
System.out.println("王者荣耀正在初始化,请稍后。。。");
}
@Override
protected void loadMap() {
System.out.println("正在加载王者峡谷地图。。。");
}
@Override
protected void loadRole() {
System.out.println("正在加载角色鲁班七号。。。");
}
@Override
protected void startPlay() {
System.out.println("开始玩王者荣耀。。。");
}
@Override
protected void endPlay() {
System.out.println("结束王者荣耀游戏,保存数据。。。");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Game game = new KingGlory();
game.play();
}
}
模板方法模式
定义
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决问题
一些方法通用,却在每一个子类都重新写了这一方法
适用场景
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法
优缺点
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞
类图:
涉及的角色:
- 抽象模板(AbstractTemplate)角色:定义了一个或多个抽象操作,以便让子类实现,这些抽象操作叫基本操作,它们是顶级逻辑的组成步骤;定义并实现了一个模板方法,这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现
- 具体模板(ContrateTemplate)角色:实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同
对应源码:
public abstract class AbstractTemplate {
public void templateMethod() {
doOperation1();
doOperation2();
doOperation3();
}
/** 基本方法,由子类实现 */
protected abstract void doOperation1();
/** 基本方法,由子类实现 */
protected abstract void doOperation2();
/** 基本方法,已经实现 */
private final void doOperation3(){
//do something......
}
}
public class ContrateTemplate extends AbstractTemplate {
@Override
protected void doOperation1() {
System.out.println("doOperation1......");
}
@Override
protected void doOperation2() {
System.out.println("doOperation2......");
}
}
西天取经的九九八十一难
在《西游记》中,唐僧到西天取经途中所经历的八十一难,说到底,是观音菩萨所控制的一个项目,下面以上面场景为例,写一个小例子:
取经人所经历的劫难,每一步都是菩萨控制好的:
public abstract class LearnFromPeople {
public final void westernCountry() {
firstHard();
secondHard();
thirdHard();
}
/** 第一难 */
protected abstract void firstHard();
/** 第二难 */
protected abstract void secondHard();
/** 第三难 */
protected abstract void thirdHard();
}
唐僧去西天取经,继承了取经人这个抽象类,然后需要历经81难:
public class TangMonk extends LearnFromPeople {
@Override
protected void firstHard() {
System.out.println("金蝉遭贬第一难");
}
@Override
protected void secondHard() {
System.out.println("出胎几杀第二难");
}
@Override
protected void thirdHard() {
System.out.println("满月抛江第三难");
}
}
唐僧开始上路了:
public class Test {
public static void main(String[] args) {
LearnFromPeople people = new TangMonk();
people.westernCountry();
}
}
需要注意的是,为了防止恶意的操作,模板方法上面都会加上final关键字
从西天取经的九九八十一难来看Java设计模式:模板方法模式的更多相关文章
- 歌乐第二弹:C++九九八十一
第一弹传送门:极乐净土 二话不说,上代码(注意事项在第一弹里): #include <windows.h> //q前缀为低音,g为高音,s前缀为半音阶 const int q1 = 131 ...
- Tony老师带你来看Java设计模式:代理模式
目录 定义 作用 意图 主要解决问题 优缺点 与装饰者模式的区别 结构 从Tony老师来看实现方式 静态代理 动态代理 JDK动态代理的实现 cglib动态代理的实现 定义 为其他对象提供一种代理来控 ...
- 从中国加入WTO来看Java设计模式:中介者模式
目录 应用场景 中介者模式 定义 意图 主要解决问题 何时使用 优缺点 世界贸易组织WTO 应用场景 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象 想通过一个 ...
- 一起来看Java设计思想之23种设计模式
目录 怎么使用设计模式 23种设计模式 创建型模式 结构型模式 行为型模式 总结 怎么使用设计模式 为什么要使用设计模式? 编写代码,写接口.写类.写方法 用设计模式做设计的作用是什么? 指导.规定如 ...
- 第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置
第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置 1.xadmin主题设置 要使用xadmin主题,需要在一个app下的adminx.py后台注册文件里,写一 ...
- “全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第八十一天学习爬取图片1
孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...
- 《手把手教你》系列基础篇(八十一)-java+ selenium自动化测试-框架设计基础-TestNG如何暂停执行一些case(详解教程)
1.简介 在实际测试过程中,我们经常会遇到这样的情况,开发由于某些原因导致一些模块进度延后,而你的自动化测试脚本已经提前完成,这样就会有部分模块测试,有部分模块不能进行测试.这就需要我们暂时不让一些t ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
随机推荐
- 权限管理整合springsecurity代码执行过程
(1)输入用户名密码. (2)进入认证过滤器中,执行attemptAuthentication方法, 通过该方法获取输入的用户名和密码. (3)执行实现了UserDetailsService接口的类中 ...
- docker启动ubuntu的桌面环境
一.概述 由于最近一段时间在家办公,国内服务器在阿里云,国外站点在aws.家里的移动宽带比较差,无法访问aws. 所以尝试在阿里云启动docker,找到一个lxde桌面环境的ubuntu镜像. 二.启 ...
- 【转+】以C++为核心语言的高频交易系统的讨论
[前言]高频交易是量化交易的核心.主要分两个方向:计算机技术和交易策略.策略各有不同,一般都是数据分析的专家或者金融,机器学习从业者.在计算机技术方面,一个是交易平台的性能,二者是硬件的性能,延时的多 ...
- Python函数注解
目录 函数注解概述 实际应用 inspect模块 业务代码 总结 以下内容基于Python 3x 涉及的知识前提: 建议理解Python装饰器后学习此内容 函数注解概述 函数注解可以针对函数的参数.返 ...
- 构造方法和this的作用
一.构造方法概述 构造方法是一个特殊的方法 是创建对象时候调用的方法 方法的名字很特殊:必须和类名保持一致,大小写都要一样 方法没有返回值 方法也没有返回值类型 构造方法无法在外部手动调用 publi ...
- HDOJ-6666(简单题+模拟题)
quailty and ccpc hdoj-6666 题目很简单,按照题目的意思模拟就行了,排序. #include<iostream> #include<cstdio> #i ...
- 如何使用 HttpReports 监控 .NET Core 应用程序
简介 HttpReports 基于.NET Core 开发的APM监控系统,使用MIT开源协议,主要功能包括,统计, 分析, 可视化, 监控,追踪等,适合在中小项目中使用. github:https: ...
- python工业互联网应用实战7—业务层
本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...
- 2.1 Python3基础-内置函数(print&input)
>>返回主目录 源代码 # 内置函数:输入/输出 name = 'Portos' age = 18 sex = 'man' score = 99.5 print('Hello World! ...
- 从sql语句的角度解刨SqlServer插入语句的并发问题
今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在sql语句上进行解决. Q:学长,我导入excel数据的操作,平时使用好好的,怎么突然发生插入重复的问题? A:你是使用哪个ORM框架进行操作的? ...