图解Java设计模式之模板模式
图解Java设计模式之模板模式
豆浆制作问题
1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的
4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。
模板方法模式基本介绍
1)模板方法模式(Template Method Pattern),又叫做模板模式(Template Pattern),在一个抽象类定义类执行它的方法的模版。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2)简单来说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3)这种类型的设计模式属于行为型模式。
模板方法模式原理类图
原理类图的说明 :
1)AbstractClass抽象类,类中实现类模版方法(template),定义类算法的骨架,具体子类需要去实现,其它的抽象方法operationr2,3,4。
2)ConcreteClass实现抽象方法 operationr2,3,4,以完成算法中特点子类的步骤。
模板方法模式解决豆浆制作问题
1)应用实例要求
编写制作豆浆的程序,说明如下 :
制作豆浆的流程 选材 --》添加配料 --》浸泡 --》放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。)
2)类图
package com.example.demo.template;
/**
* 抽象类,表示豆浆
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk {
/**
* 模版方法,make,模版方法可以做成final,不让子类去覆盖。
*/
final void make() {
select();
addCondiments();
soak();
beat();
}
/**
* 选材料
*/
void select() {
System.out.println("第一步 :选择好的新鲜黄豆 ");
}
/**
* 添加不同的配料,抽象方法,子类具体实现
*/
abstract void addCondiments();
/**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
}
void beat() {
System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
}
}
package com.example.demo.template;
public class RedBeanSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的红豆 ");
}
}
package com.example.demo.template;
public class PeanutSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的花生 ");
}
}
package com.example.demo.template;
public class Client {
public static void main(String[] args) {
// 制作红豆豆浆
System.out.println("-- 制作红豆豆浆 --");
SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("-- 制作花生豆浆 --");
SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
模板方法模式的钩子方法
1)在模板方法模式的父类中,定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
2)还是用上面做豆浆的例子来讲解,比如,制作纯豆浆,不添加任何的配料,使用钩子方法对前面的模版方法进行改造。
package com.example.demo.template;
/**
* 抽象类,表示豆浆
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk {
/**
* 模版方法,make,模版方法可以做成final,不让子类去覆盖。
*/
final void make() {
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
}
/**
* 选材料
*/
void select() {
System.out.println("第一步 :选择好的新鲜黄豆 ");
}
/**
* 添加不同的配料,抽象方法,子类具体实现
*/
abstract void addCondiments();
/**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
}
void beat() {
System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
}
/**
* 钩子方法,决定是否需要添加配料
* @return
*/
boolean customerWantCondiments() {
return true;
}
}
package com.example.demo.template;
public class PureSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
// 空实现
}
@Override
boolean customerWantCondiments() {
// TODO Auto-generated method stub
return false;
}
}
模板方法模式在Spring框架中的源码分析
下面这两个是钩子方法,默认空实现,让子类去实现。
下面是子类实现的方法
模板方法模式的注意事项和细节
- 基本思想是 :算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
- 实现类最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
- 既统一了算法,也提供类很大的灵活性。父类的模板方法确保类算法的结构保持不变,同时由子类提供部分步骤的实现。
- 该模式的不足之处 :每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
- 一般模板方法都加final关键字,防止子类重写模板方法。
- 模板方法模式使用场景 :当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通车考虑用模板方法模式来处理
图解Java设计模式之模板模式的更多相关文章
- JAVA设计模式之模板模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- Java设计模式之模板模式(Template )
前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...
- 13.java设计模式之模板模式
基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...
- java设计模式之模板模式以及钩子方法使用
1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ...
- Java设计模式之模板模式及使用场景
模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 图解Java设计模式之设计模式面试题
图解Java设计模式之设计模式面试题 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
随机推荐
- 849. Dijkstra求最短路 I
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- 微信小程序配置二
tabBar 客户端窗口底部的tab页面切换,只能配置最好两个.最多5个tab 属性说明: 属性 类型 必填 默认值 描述 color HexColor 是 tab上的文字默认颜色 selectedC ...
- 为什么我们要让人工智能玩游戏:微软Project AIX
<我的世界>游戏 2016年7月注:Project AIX已正式更名为Project Malmo 注:本文编译自Project AIX: Using Minecraft to build ...
- Golang: chan定义问题(7)
通常都是定义读写双向的 chan,定义单向 chan 问题. 专栏的介绍可以参考 <GotchaGolang专栏>,代码可以看<宝库-Gotcha>. 通过 只写 chan 传 ...
- 强制迁移、合区 APP太强势伤害用户同时是否违法?
APP太强势伤害用户同时是否违法?" title="强制迁移.合区 APP太强势伤害用户同时是否违法?"> 对于经常混迹在国内各大手游的玩家来说,"合区& ...
- Logstash实践
转载请注明出处:https://www.cnblogs.com/shining5/p/9542710.html Logstash简介 一个开源的数据收集引擎,具有实时数据传输能力,可以统一过滤来自不同 ...
- 解决WebMvcConfigurer下的addViewControllers无法找到制定页面
解决WebMvcConfigurer下的addViewControllers无法找到制定页面 这种都已经配置了拦截跳转,但无效的原因是,没有加载thymeleaf依赖 <dependency&g ...
- 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqpOdR/ 可交互视频 此视频是 ...
- p2.js 与 createjs 的组合应用
开始前简单说下其他几款js物理引擎 box2d老牌,功能全面,但是效率低下,移动端基不用考虑的 matterjs 效率目前我测试下来最高,但是依然还在开发中(好像还很缓慢),目前功能局限,而且有bu ...
- JavaScript两道例题
1.有一个卡车司机肇事后想逃跑,但是被三个人看见其车牌号码,但是没有看全.一号说:车牌的前两位是一样的,二号说:车牌的后两位是一 样的,但是与前两位不一样,三号说:车牌是一个数字的平方,请计算车辆号牌 ...