模版模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法可以使子类方法在不改变算法结构的情况下,重新定义算法中的某些步骤
实现要素:准备一个抽象类,将部分逻辑以具体的方法实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给与子类更大的灵活性。最后,将方法汇总成一个不可改变的模版方法。
/*
* 抽象基类,为所有子类提供一个算法框架
*
* 提神饮料
*/
public abstract class RefreshBeverage {
/*
* 制备饮料的模版方法
*
* 封装了所有子类共同遵循的算法框架
*/
public final void prepareBeverageTemplete(){
//1,将水煮沸
boilWater();
//2,泡制饮料
brew();
//3,将饮料导入杯中
pourInCup();
if(isCustomerWantsCondiments()){
//4,加入调味料
addCondiments();
}
}
/*
* HOOK,钩子函数,提供一个默认或空的实现
* 具体的子类可以决定是否挂钩以及如何挂钩
*
* 询问用户是否加入调料
*/
protected Boolean isCustomerWantsCondiments() {
return true;
}
/*
* 基本方法 ,将水煮沸
*/
private void boilWater() {
// TODO Auto-generated method stub
System.out.println("将水煮沸");
}
/*
* 抽象方法,泡制饮料
*/
protected abstract void brew();
/*
* 基本方法,将饮料导入杯中
*/
private void pourInCup() {
System.out.println("倒入杯中");
}
/*
* 抽象方法,添加调味料
*/
protected abstract void addCondiments();
}
public class Tea extends RefreshBeverage{
@Override
protected void brew() {
System.out.println("用80度的热水泡制5分钟");
}
@Override
protected void addCondiments() {
// TODO Auto-generated method stub
System.out.println("加入柠檬");
}
@Override
/*
* 子类通过覆盖的形式选择挂载钩子函数
* (non-Javadoc)
* @see com.xzy.template.RefreshBeverage#isCustomerWantsCondiments()
*/
protected Boolean isCustomerWantsCondiments() {
// TODO Auto-generated method stub
return false;
}
}
public class Coffee extends RefreshBeverage{
@Override
protected void brew() {
// TODO Auto-generated method stub
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
// TODO Auto-generated method stub
System.out.println("加入糖和牛奶");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("制备咖啡...");
RefreshBeverage rb = new Coffee();
rb.prepareBeverageTemplete();
System.out.println("咖啡好了...");
System.out.println("\n****************************************");
rb = new Tea();
System.out.println("制备茶....");
rb.prepareBeverageTemplete();
System.out.println("茶好了...");
}
}