二十三种设计模式(第十三种)-----模板方法模式(Template Method)
尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470
- 模板方法模式,又叫模板模式,在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方法执行。
- 简单说,模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法结构,就可以重新定义该算法的某些特定步骤
- 行为型模式
类图
案例
案例类图
代码
1.豆浆抽象类
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("第四步:黄豆和配料放到豆浆机去打碎");
}
}
2.具体实现—红豆豆浆
public class RedBeanSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的红豆");
}
}
3.具体实现—花生豆浆
public class PeanutSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的花生");
}
}
4.客户端
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.修改豆浆抽象类,添加钩子函数
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("第四步:黄豆和配料放到豆浆机去打碎");
}
//钩子方法,决定是否需要添加配料
boolean customerWantCondiments(){
return true;
}
}
2.具体实现—纯豆浆
public class PureSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
}
@Override
boolean customerWantCondiments() {
return false;
}
}
3.客户端
public static void main(String[] args) {
System.out.println("----制作红豆豆浆---");
SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("---制作花生豆浆---");
SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
System.out.println("---制作纯豆浆---");
SoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}