demo描述:要制作不同口味的豆浆,制作流程相同,制作期间加的料不同。将制作流程做成模板,与具体实现结合完成一个完整的制作流程
demo代码:
制作流程:
public abstract class SoyaMilk {
// 钩子方法,决定是否添加配料
boolean customerWantCondiments() {
return true;
}
//模板方法,可以做成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("第四步:黄豆和配料放到豆浆机去打碎");
}
}
具体豆浆:
public class PureSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
//空实现
//纯豆浆不加东西
}
@Override
boolean customerWantCondiments() {
return false;
}
}
public class PennutSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的花生");
}
}
public class BlackBeanSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
System.out.println("加入上好的黑豆");
}
}
客户端:
public class Client {
public static void main(String[] args) {
System.out.println("做黑豆豆浆");
SoyaMilk redBeanSoyaMilk = new BlackBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("==============================");
System.out.println("做花生豆浆");
SoyaMilk pennutSoyaMilk = new PennutSoyaMilk();
pennutSoyaMilk.make();
System.out.println("==============================");
System.out.println("做纯豆浆");
SoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}
}
demo类图:
类图分析:1处为具体口味的豆浆,可扩展;将业务流程抽象出来,关注点在流程的复用
适用场景:业务流程相同时可用模板方法
总结:模板方法定义了操作中的算法骨架结构,将一些步骤延迟到了子类,使子类在不改变算法结构的同时重新定义该算法。与建造者模式不同的是建造者模式更加关注产品多样,由于建造过程复杂流程中每一步都单独处理;模板方法更加关注流程复用,将固定的步骤写了模板里,可变的步骤交给子类;两者相同点是都会抽象出流程