叩心自问:什么是模板模式?
sadasd模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。 它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
sada d【注】:模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
sadasdUML图如下:
sasdsddsdsdsdsdsdas
sadasdAbstractClass 抽象类 : 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法operationr2,3,4.
sadasdConcreteClass : 实现抽象方法operationr2,3,4, 以完成算法中特点子类的步骤
sadasd应用:豆浆制作问题,制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎,通过添加不同的配料,可以制作出不同口味的豆浆,选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)
sadasd豆浆UML图如下:
sadsdsdasd
sadasd模板–抽象类代码:
public abstract class SoyaMilk {
void make(){ //整个流程
select();
add();
soak();
beat();
};
void select(){
System.out.println("第一步,选择好的新鲜黄豆");
};
//添加不同配料,抽象方法,子类具体实现
abstract void add();
void soak(){
System.out.println("第三步,黄豆和配料开始浸泡,需要3小时");
};
void beat(){
System.out.println("第四步,黄豆和配料放到豆浆打碎");
};
}
sadasd红豆奶茶的具体实现方法:
public class RedBeanMilk extends SoyaMilk{
@Override
void add() {
System.out.println("加入好的红豆");
}
}
sadasd花生奶茶的具体实现方法:
public class PeanutSoyaMilk extends SoyaMilk{
@Override
void add() {
System.out.println("加入好的花生");
}
}
sadasd测试及结果:
public class Client {
public static void main(String[] args) {
System.out.println("制作红豆豆浆");
RedBeanMilk redBeanMilk = new RedBeanMilk();
redBeanMilk.make();
System.out.println("制作花生豆浆");
PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
-------------------------------------------------------------------------------------------
结果:
制作红豆豆浆
第一步,选择好的新鲜黄豆
加入好的红豆
第三步,黄豆和配料开始浸泡,需要3小时
第四步,黄豆和配料放到豆浆打碎
制作花生豆浆
第一步,选择好的新鲜黄豆
加入好的花生
第三步,黄豆和配料开始浸泡,需要3小时
第四步,黄豆和配料放到豆浆打碎
sadasd思考:当我们不需要加任何配料,只是做纯豆浆时,我们需要修改模板模式的父类,我们可以定义一个代码,它默认不做任何事,子类视情况看要不要覆盖它,我们把这个方法称为 “钩子”。
sadasd模板–抽象类代码修改:
public abstract class SoyaMilk {
final void make(){
select();
if(customerWantConditions()){
add();
}
soak();
beat();
};
void select(){
System.out.println("第一步,选择好的新鲜黄豆");
};
//添加不同配料,抽象方法,子类具体实现
abstract void add();
void soak(){
System.out.println("第三步,黄豆和配料开始浸泡,需要3小时");
};
void beat(){
System.out.println("第四步,黄豆和配料放到豆浆打碎");
};
//钩子方法,决定是否需要添加配料
boolean customerWantConditions(){
return true;
}
}
sadasd纯豆浆的具体方法:
public class PureSoyaMilk extends SoyaMilk{
@Override
void add() { }
@Override
boolean customerWantConditions() {
return false;
}
}
sadasd测量及结果:
public class Client {
public static void main(String[] args) {
System.out.println("制作红豆豆浆");
RedBeanMilk redBeanMilk = new RedBeanMilk();
redBeanMilk.make();
System.out.println("制作花生豆浆");
PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
System.out.println("制作纯豆浆");
PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}
}
-------------------------------------------------------------------------------------------
制作红豆豆浆
第一步,选择好的新鲜黄豆
加入好的红豆
第三步,黄豆和配料开始浸泡,需要3小时
第四步,黄豆和配料放到豆浆打碎
制作花生豆浆
第一步,选择好的新鲜黄豆
加入好的花生
第三步,黄豆和配料开始浸泡,需要3小时
第四步,黄豆和配料放到豆浆打碎
制作纯豆浆
第一步,选择好的新鲜黄豆
第三步,黄豆和配料开始浸泡,需要3小时
第四步,黄豆和配料放到豆浆打碎
Process finished with exit code 0
叩心自问:模板方法模式在Spring框架应用的源码
sadasd模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。 它的子类可以按需要重写。
sadasdUML图如下: