一、例子
1、制作豆浆
2、流程:选择材料、添加配料、浸泡、放到豆浆机打碎
3、步骤对于每种口味的豆浆都是一样的。
二、模版方法模式介绍
1、模版方法模式(Template Method Pattern),又叫模版模式(Template Pattern)在一个抽象类公开定义了执行它的方法的模版。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2、属于设计模式的行为模式
3、抽象模版的算法骨架,具体实现在子类中进行,单步骤框架按抽象类的流程走。
三、模版方法模式之钩子方法
1、简单理解就事在父类中定义一个方法不做任何事情,子类可以视情况要不要覆盖它。
四、代码
1、模板方法模式
package com.hao.demo.design.template;
/**
* @author
* @date 2020-05-23
*/
// 抽象类,表示豆浆
public abstract class AbstractSoyaMilk {
// 模版方法,make 模版方法可以做成final,不让子类去覆盖 防止子类修改
final void make() {
select();
addCondiments();
soak();
beat();
}
// 选择材料
void select() {
System.out.println("选择不同的材料");
}
// 添加不同的材料 抽象方法,子类具体实现
abstract void addCondiments();
// 浸泡
void soak() {
System.out.println("浸泡三个小时");
}
// 打豆浆
void beat() {
System.out.println("放入打浆机打碎");
}
}
package com.hao.demo.design.template;
/**
* @author
* @date 2020-05-23
*/
public class PeanutSoyaMilk extends AbstractSoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的花生");
}
}
package com.hao.demo.design.template;
/**
* @author
* @date 2020-05-23
*/
public class RedBeanSoyaMilk extends AbstractSoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的红豆");
}
}
package com.hao.demo.design.template;
/**
* @author
* @date 2020-05-23
*/
public class Client {
public static void main(String[] args) {
// 制作红豆豆浆
System.out.println("制作红豆豆浆");
AbstractSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("制作花生豆浆");
AbstractSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
2、钩子方法
package com.hao.demo.design.templateimprove;
/**
* @author
* @date 2020-05-23
*/
// 抽象类,表示豆浆
public abstract class AbstractSoyaMilk {
// 模版方法,make 模版方法可以做成final,不让子类去覆盖 防止子类修改
final void make() {
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
}
// 选择材料
void select() {
System.out.println("选择不同的材料");
}
// 添加不同的材料 抽象方法,子类具体实现
abstract void addCondiments();
// 浸泡
void soak() {
System.out.println("浸泡三个小时");
}
// 打豆浆
void beat() {
System.out.println("放入打浆机打碎");
}
// 钩子方法 决定是否需要添加配料
boolean customerWantCondiments() {
return true;
}
}
package com.hao.demo.design.templateimprove;
/**
* @author
* @date 2020-05-23
*/
public class Client {
public static void main(String[] args) {
// 制作红豆豆浆
System.out.println("制作红豆豆浆");
AbstractSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("制作花生豆浆");
AbstractSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
System.out.println("制作纯豆浆");
AbstractSoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}
}
package com.hao.demo.design.templateimprove;
/**
* @author
* @date 2020-05-23
*/
public class PureSoyaMilk extends AbstractSoyaMilk {
@Override
void addCondiments() {
System.out.println("制作纯豆浆不添加任何配料");
}
// 钩子方法
@Override
boolean customerWantCondiments() {
return false;
}
}