基本介绍

模板方法模式(Template Method Pattern)也叫模板模式,它在一个抽象类中公开定义了执行它的方法的模板,它的字类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。

简单来说,模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就能重新定义该算法的某些特定步骤

模式结构

  • AbstractClass:抽象类,类中实现了模板方法,定义了算法的骨架

  • ConcreteClass:实现类,继承抽象类,重写其中的抽象方法

举例说明

编写一个制作豆浆的程序

制作豆浆的流程:选材(黄豆) → 添加配料 → 浸泡 → 磨豆浆

要求:通过添加不同的配料,可以制作出不同口味的豆浆(除了添加配料不同,其它步骤是相同的)

1、定义一个抽象类,BaseSoyMilk:豆浆类

public abstract class BaseSoyMilk {
/**
* 模板方法,制作豆浆的流程
* 声明为 final,防止子类重写
*/
protected final void make() {
select();
addOther();
soak();
grind();
} private void select() {
System.out.println("选择上好的黄豆");
} protected abstract void addOther(); private void soak() {
System.out.println("浸泡原材料");
} private void grind() {
System.out.println("研磨成豆浆");
}
}

2、创建子类,PeanutSoyMilk:花生豆浆

public class PeanutSoyMilk extends BaseSoyMilk {
@Override
protected void addOther() {
System.out.println("添加花生");
}
}

RedBeanSoyMilk:红豆豆浆

public class RedBeanSoyMilk extends BaseSoyMilk {
@Override
protected void addOther() {
System.out.println("添加红豆");
}
}

3、创建测试类:Client

public class Client {
@Test
public void test() {
BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
peanutSoyMilk.make();
System.out.println("****************");
BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
redBeanSoyMilk.make();
}
}

4、运行结果

选择上好的黄豆
添加花生
浸泡原材料
研磨成豆浆
************
选择上好的黄豆
添加红豆
浸泡原材料
研磨成豆浆

钩子方法

在模板方法模式的抽象类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况来决定是否重写它,该方法称为「钩子」。

依然以上面制作豆浆的例子来说明,如果我们什么配料都不想加,制作纯豆浆,可以使用钩子方法对其改造。

1、为 BaseSoyMilk 类添加一个方法 isAdd 判断是否添加其它材料

public abstract class BaseSoyMilk {
/**
* 模板方法,制作豆浆的流程
* 声明为 final,防止子类重写
*/
protected final void make() {
select();
if(isAdd()){
addOther();
}
soak();
grind();
} private void select() {
System.out.println("选择上好的黄豆");
} protected abstract void addOther(); private void soak() {
System.out.println("浸泡原材料");
} private void grind() {
System.out.println("研磨成豆浆");
} protected boolean isAdd(){
return true;
}
}

2、创建一个子类 PureSoyMilk:纯豆浆

public class PureSoyMilk extends BaseSoyMilk {
@Override
protected void addOther() {
} @Override
protected boolean isAdd() {
return false;
}
}

3、测试

@Test
public void test2() {
BaseSoyMilk pureSoyMilk = new PureSoyMilk();
pureSoyMilk.make();
}

4、运行结果(现在就没有添加其它材料的步骤了)

选择上好的黄豆
浸泡原材料
研磨成豆浆

模式分析

设计模式 - 模板方法模式详解及其在Spring中的应用的更多相关文章

  1. 设计模式 - 命令模式详解及其在JdbcTemplate中的应用

    基本介绍 在软件设计中,我们经常需要向某些对象发送一些请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得 ...

  2. 设计模式 - 迭代器模式详解及其在ArrayList中的应用

    基本介绍 迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节 模式结构 Iterator(抽象迭代器):定义遍历 ...

  3. JS设计模式——工厂模式详解

    它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ...

  4. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...

  5. 二十:职责链模式详解(类似于spring的hangler处理请求)

    定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ...

  6. Javascript设计模式之装饰者模式详解篇

    一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...

  7. 代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  8. rabbitmq五种模式详解(含实现代码)

    一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...

  9. C#设计模式-模板方法模式

    提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...

随机推荐

  1. OpenCV-Python 读取显示视频 | 六

    目标 学习读取视频,显示视频和保存视频. 学习从相机捕捉并显示它. 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频 通常情况下,我们必须用摄像 ...

  2. arcgis server10.7修改打印模板后前台调用不生效

    在10.5.1及之前的版本中,如果更改打印地图模板,如字体设置,那么直接修改[ArcGIS for Server 安装目录]/Templates/ExportWebMapTemplates下的mxd的 ...

  3. 开源APP

    仿微信 https://github.com/zhengwenming/WeChat 电台韵律 https://github.com/DaMingShen 运动App https://github.c ...

  4. iOS 应用签名

    一.密码学简介 1.1 base64 Base64 是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行. Base64 适用于小段内容的编码,比如数字证书签名.Cookie 的内容等 ...

  5. 12c OCR corrupted results in CRS stack down.

    12c OCR corrupted results in CRS stack down. 1. check crsd.trc2017-03-21 16:14:44.667838 :  CRSOCR:2 ...

  6. MATLAB 排序、拟合

    一.数据排序整合 1.随机生成的数,从小到大排序 clear rand('seed',1)%设置随机种子,确保随机数一样 edge_range=unifrnd (1, 10, 1, 10) edge_ ...

  7. Ubuntu16.04下LAMP环境的安装与配置

    Ubuntu16.04下LAMP环境的安装与配置 最近做个实验需要用到Ubuntu环境的靶场,所以这里介绍下Ubuntu环境下LAMP的安装与配置,话不多说,我们gkd! 1.Apache2的安装 首 ...

  8. Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推

    https://codeforces.com/contest/1330/problem/D 给出d,m, 找到一个a数组,满足以下要求: a数组的长度为n,n≥1; 1≤a1<a2<⋯&l ...

  9. Linux网络安全篇,配置Yum源(一),本地Yum源

    1.创建挂载目录 mkdir /mnt/cdrom 2.挂载软件源cdrom mount /dev/cdrom /mnt/cdrom/ 3.建立本地yum源资源文件夹 mkdir /usr/local ...

  10. Java第二十天,Map集合(接口)

    Map接口 一.定义 Map集合是双列集合,即一个元素包含两个值(一个key,一个value),Collection集合是单列集合. 定义格式: public interface Map<K,V ...