基本介绍

模板方法模式(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. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  2. NOI ONLINE 入门组 魔法 矩阵快速幂

    做了这道题我才发现NOI入门组!=NOIP普及组 题目链接 https://www.luogu.com.cn/problem/P6190 题意 给出一张有向图,你有K次机会可以反转一条边的边权,即让它 ...

  3. iOS 继承

    是否使用继承需要考虑三个点: 父类只是给子类提供服务,并不涉及子类的业务逻辑 层级关系明显,功能划分清晰,父类和子类各做各的. 父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求 万不得 ...

  4. 如何找回QQ聊天记录、语音、图片?

    多图长图预警,本教程适用于 安卓手机 认真仔细看完答案的成功几率翻倍哟! 请各位认真看答案!求您了~ 2020年/4/4日 更新 人民不会忘记,祖国不会忘记,我们不会忘记,先烈不朽. 调整答案顺序,使 ...

  5. 解决Pycharm导入当前项目的.py文件错误

    如图所示错误,由左边导航栏可见.py文件存在: 解决办法:右键单击导包错误文件所在目录,选择[Mark Directory as]+[Sources Root] 错误已解决:

  6. 手工注入——access手工注入实战和分析

    今天进行了access手工注入,下面是我的实战过程和总结. 实战环境使用的是墨者学院的在线靶场.下面咱们直接进入主题. 第一步,判断注入点 通过‘ 或者 and 1=1 和 and 1=2 是否报错, ...

  7. PHP友盟推送消息踩坑及处理

    公司的客户端的推送选用友盟推送,但是友盟的官方文档描述很少,对新手很不友好,所以特写此采坑纪录,废话不多说上代码. 公司业务只涉及单播和广播.所以只提供了单播和广播,业务拓展的话会补充其余部分. 消息 ...

  8. B [JLOI2012]树

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,128m 问题描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点 ...

  9. 《SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS》论文阅读

    背景简介 GCN的提出是为了处理非结构化数据(相对于image像素点而言).CNN处理规则矩形的网格像素点已经十分成熟,其最大的特点就是利用卷积进行①参数共享②局部连接,如下图: 那么类比到非结构数据 ...

  10. 1046 Shortest Distance (20分)

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...