设计模式 - 模板方法模式详解及其在Spring中的应用
基本介绍
模板方法模式(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、运行结果(现在就没有添加其它材料的步骤了)
选择上好的黄豆
浸泡原材料
研磨成豆浆
模式分析
基本介绍 在软件设计中,我们经常需要向某些对象发送一些请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得 ... 基本介绍 迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节 模式结构 Iterator(抽象迭代器):定义遍历 ... 它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常 ... 前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ... 定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ... 一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ... 1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ... 一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ... 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ... ![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png ... 镜像加速器配置: 下文配置引用于阿里云说明文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 1. 安装/升级Docker客户 ... 本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第14篇文章,我们来聊聊大名鼎鼎的EM算法. EM算法的英文全称是Expectation-maximization al ... 短路规则:a||b中若a为真,则直接判断整个表达式为真,不再判断b是真或假, a&&b中若a为假,则直接判断整个表达式为假,不再单独判断b是真或假. 想要测试这个规则的话,可以将 ... psutil模块介绍 psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等.此外,psutil还可以用来进行进程管理,包括判断进程是否存在.获取 ... 题目链接 题意 给出一个高度为 h 的大根堆, 要求弹出其中若干个数后高度变为 g, 并且前后大根堆都是满二叉树. 问新的大根堆所有数之和的最小值, 并要给出一种弹出数的操作序列(节点序号). h, ... 目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ... 前言 近期在做项目时遇到了好几起由于自动偏移或则没有自动偏移而导致的界面布局问题,尤其是在昨晚新版本赶上IOS9系统升级的时候,刚升级完了后就发现项目里面很多使用UINavgati ... 有时我们需要对用户的输入进行一些处理,比如用户输入的密码或者用户名我们就需要去除前后空格,下面写一个去除空白字符的方法 function trim(string = '') { return stri ... 不可否认的是,OpenStack仍然是可行的云操作系统,并且被全世界许多互联服务提供商使用.而Rancher是业界最为广泛使用的Kubernetes管理平台,通过简洁直观的GUI集中管理企业IT中的多 ...设计模式 - 模板方法模式详解及其在Spring中的应用的更多相关文章
随机推荐