图解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操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
随机推荐
- Python 零基础入门
Python 零基础入门 1.1 Python介绍 Python 是一门优雅且健壮的面向对象解释型计算机程序编程语言,具有面向对象.可升级.可扩展.可移植 语法简洁清晰易学.易读写.易维护.健壮性.通 ...
- Ansible(一) Try it - 枯鱼的博客
学习ansible的最好方式就是使用,先别管什么inventory,playbook,module这些.按照安装文档安装,然后try it,一边学一边体验,这样的速度是最快的.当熟悉了之后,想要深入就 ...
- 强制迁移、合区 APP太强势伤害用户同时是否违法?
APP太强势伤害用户同时是否违法?" title="强制迁移.合区 APP太强势伤害用户同时是否违法?"> 对于经常混迹在国内各大手游的玩家来说,"合区& ...
- C++走向远洋——59(项目三、图形面积、抽象类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- java反序列化-ysoserial-调试分析总结篇(4)
1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ...
- 优雅的创建一个JavaScript库
这篇文章的目的是通过演示一个简单的例子来介绍在JS中实例化和定义一个库的正确方法,以优化他人编写或维护自己的JS库. 在我们深入之前,我做了两点假设: 你知道简单的JavaScript或C语言. 你不 ...
- 微信小程序实战(一)之仿美丽说
被美丽说少女粉吸引,就想着自己也写一个来练练手,正好最近在学习微信小程序.接下来让我们分享一下我的学习历程吧! 选题 其实纠结了好久该仿什么,看到别人都写的差不多了,自己却还没有动手,很着急,那两天一 ...
- IDEA Messages Build总是自动弹出提示错误
IDEA,总是在代码未完成时,在进行切换页面回来后会跳出Messages Build,我相信大家在写java web项目的时候,经常会遇到这个问题,接下来我就和大家说一下问题所在. 主要原因是因为我们 ...
- vue的子组件不能进行router的切换
在用vue开发过程中,偶然一次使用在子组件中进行router的切换,发现不起作用,后来才反应过来,子组件只是一个组件,vue的路由的切换只能是在父组件(也就是真正的页面)里面进行跳转!
- 基于VR三维全景的虚拟展馆展览实现
VR三维全景虚拟现实技术的应用,能够通过全方位互动式来还原真实场景,令人产生一种身临其境的感觉,由于三维全景虚拟现实技术具有一定应用优势,其在企业与院校展示.建筑规划展示.酒店宾馆展示等方面都逐步得到 ...