图解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框架中的源码分析

下面这两个是钩子方法,默认空实现,让子类去实现。

下面是子类实现的方法

模板方法模式的注意事项和细节

    1. 基本思想是 :算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

    2. 实现类最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

    3. 既统一了算法,也提供类很大的灵活性。父类的模板方法确保类算法的结构保持不变,同时由子类提供部分步骤的实现。

    4. 该模式的不足之处 :每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

    5. 一般模板方法都加final关键字,防止子类重写模板方法。

    6. 模板方法模式使用场景 :当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通车考虑用模板方法模式来处理

(0)

相关推荐

  • 设计模式-行为型-模板模式

    模板模式(Template): 提到模板,可能大多数人想到的是"简历模板"."论文模板"等,比如我们要写简历时,会从网上下载一份漂亮的简历模板,其格式是固定的, ...

  • 快速掌握模板方法模式

    概述 模板模式就是定义一个操作中的算法骨架,然后将一些步骤延迟到子类中.模板方法使得子类在不改变算法的结构即可重定义该算法的某些步骤. 使用场景 泡茶 我们都知道泡茶基本步骤有: 烧水.选茶叶.泡茶. ...

  • JAVA架构师之路十四:设计模式之模板模式

    JAVA架构师之路十三:设计模式之委派模式 模板模式 1. 模板模式 2. 模板模式案例 3. JDBC模板模式 没有意志,理想便是幻想. 1. 模板模式 定义 通常又叫模板模式,是指定义一个算法的骨 ...

  • 无废话设计模式(12)行为型模式--模板方法模式

    0-前言 模板方法模式定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中: 模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤: 1-实现 1-1.简单UML图:  1-2 ...

  • TemplateMethodPattern模板方法模式

    模板方法模式 1.定义 定义一个操作中的算法的框架,而将一些步骤的实现延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 使用模板方法模式制造两款汽车.定义汽车必须有的特质 ...

  • 模板方法模式

    一.模板方法模式介绍 1.定义与类型 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤 类型:行为型 2.适用场景 ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • 图解Java设计模式之解释器模式

    图解Java设计模式之解释器模式 四则运算问题 传统方案解决四则运算问题分析 解释器模式基本介绍 解释器模式来实现四则 解析器模式在Spring框架中的源码分析 解释器模式的注意事项和细节 四则运算问 ...

  • 图解Java设计模式之备忘录模式

    游戏角色状态恢复问题 传统方案解决游戏角色恢复 传统的方式的问题分析 备忘录模式基本介绍 备忘录模式原理类图 游戏角色恢复状态实例 备忘录模式的注意事项和细节 游戏角色状态恢复问题 游戏角色有攻击力和 ...

  • 图解Java设计模式之命令模式

    智能生活项目需求 命令模式基本介绍 命令模式的原理类图 命令模式在Spring框架中JdbcTemplate应用源码分析 命令模式的注意事项和细节 智能生活项目需求 看一个具体的需求 我们买类一套智能 ...

  • 图解Java设计模式之桥接模式

    手机操作问题 传统方案解决手机操作问题 传统方案解决手机操作问题分析 桥接模式(Bridge)-基本介绍 桥接模式解决手机操作问题 桥接模式在JDBC中的源码解析 桥接模式的注意事项和细节 桥接模式其 ...

  • 图解Java设计模式之中介者模式

    智能家庭项目 传统方案解决智能家庭管理问题 中介者模式基本介绍 中介者模式的原理类图 中介者模式 - 智能家庭的操作流程 中介者模式的注意事项和细节 智能家庭项目 1)智能家庭包括各种设备,闹钟.咖啡 ...

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • 图解Java设计模式之观察者模式

    天气预报项目需求 1)气象站可以将每天测量到的湿度.温度.气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2)需要设计开放型API,便于其他第三方也能接入气象站获取数据. 3)提供温度 ...

  • 图解Java设计模式之单例设计模式

    图解Java设计模式之单例设计模式 设计模式介绍 设计模式类型 单例设计模式介绍 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代 ...