模板方法模式的概念
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。目的是为了解决一些方法通用,却在每一个子类中都重写这些方法的问题。将通用的方法在抽象类中实现,而需要重写的方法则在子类中实现。
抽象类模板(豆浆):
public abstract class SoyaMilk {
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("第四步:捣碎");
}
}
子类1(花生豆浆):
public class PeanutSoyaMilk extends SoyaMilk {
void addCondiments() {
System.out.println("第三步:加入花生");
}
}
子类2(红豆豆浆):
public class RadBeanSoyaMilk extends SoyaMilk {
void addCondiments() {
System.out.println("第三步:加入红豆");
}
}
主函数:
public class MainActivity {
public static void main(String[] args) {
RadBeanSoyaMilk radBeanSoyaMilk = new RadBeanSoyaMilk();
radBeanSoyaMilk.make();
PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
执行结果
第一步:选黄豆
第三步:加入红豆
第三步;浸泡
第四步:捣碎
第一步:选黄豆
第三步:加入花生
第三步;浸泡
第四步:捣碎
钩子方法(如果是纯豆浆,则不添加任何配料):
添加钩子方法,修改抽象类模板:
public abstract class SoyaMilk {
final void make(){
select();
if (!isPureSoyaMilk())
addCondiments();
soak();
beat();
}
void select() {
System.out.println("第一步:选黄豆");
}
abstract void addCondiments();
void soak() {
System.out.println("第三步;浸泡");
}
void beat() {
System.out.println("第四步:捣碎");
}
boolean isPureSoyaMilk() {
return false;
}
}
子类3:
public class PureSoyaMilk extends SoyaMilk {
void addCondiments() {
System.out.println("123");
}
@Override
boolean isPureSoyaMilk() {
return true;
}
}
在主函数中加入:
PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
执行结果
第一步:选黄豆
第三步;浸泡
第四步:捣碎