前言:著名的好莱坞原则,即don't call me ,i will call you,模板设计模式就是遵循这一原则的
一、使用场合:
模板设计模式:一些事物流程是固定,流程中的具体步骤有的是固定的实现,有的步骤有不同的实现,
二、基本思路以及实例:
定义一个抽象类Drink,Coffee类和Tea类继承该类,在Drink类中定义一个generateProcess方法,包含了饮料冲泡的流程(固定),以及具体的boil(),addMaterial()等方法(有的固定有的不固定)
其中使用到了钩子函数isCustomerWant(),用于控制某个步骤是否要在子类中实现。
钩子函数:在父类中提供一个默认实现,具体控制在子类中实现
三、具体代码
package com.dp.template;public abstract class Drink {
protected void generateProcess(){
boil();
addMaterial();
addWater();
if(isCustomerWant()){
addIngrediant();
}
}
public boolean isCustomerWant() {
// TODO Auto-generated method stub
return true;
}
//烧水,共有步骤
public void boil(){
System.out.println("将水烧开。。。");
}
//放入原料,自定义步骤
public abstract void addMaterial();
//加水冲泡饮料
public void addWater(){
System.out.println("开始冲泡");
}
//添加调味,自定义步骤
public abstract void addIngrediant();
}
package com.dp.template;
public class Coffee extends Drink {
@Override
public void addIngrediant() {
// TODO Auto-generated method stub
System.out.println("加入牛奶");
}
@Override
public void addMaterial() {
// TODO Auto-generated method stub
System.out.println("放入咖啡豆");
}
}
package com.dp.template;
public class Tea extends Drink {
@Override
public void addIngrediant() {
// TODO Auto-generated method stub
System.out.println("加入柠檬");
}
@Override
public void addMaterial() {
// TODO Auto-generated method stub
System.out.println("放入茶叶");
}
@Override
public boolean isCustomerWant() {
// TODO Auto-generated method stub
return false;
}
}
package com.dp.template;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//冲咖啡
System.out.println("开始泡咖啡");
Drink dk = new Coffee();
dk.generateProcess();
System.out.println("咖啡泡好了");
System.out.println();
//泡茶
System.out.println("开始泡茶");
dk = new Tea();
dk.generateProcess();
System.out.println("茶泡好了");
}
}