模板方法的基本实现:
1.思想
a)一份算法框架,大家共同遵守b)算法框架中分离出变与不变的部分c)将变化的算法,延迟实现(交由具体的子类实现)
2.基本实现
a)用一个抽象基类,一个public_final方法定义好算法框架
b)不变的部分,用private方法加以实现。(基本方法)
c)变化的部分,用protected_abstract加以定义(抽象方法)
例子:泡茶和泡咖啡,其步骤如下
冲泡饮品 茶 咖啡 把水煮沸 把水煮沸 用沸水浸泡茶叶 用溺水冲泡咖啡 将饮品倒入杯中 将饮品倒入杯中 加入柠檬片 加入糖和牛奶
第一步和第三步是相同步骤,可以在抽象基类中实现,第二步和第四步交由实现这个基类的子类来实现(这两步要不要实现,可定义钩子函数来进行判断)
基类:
package com.test;
/**
* Created by admin on 2018/1/11.
* 抽象基类,为所有子类提供一个算法框架
*/
public abstract class RefreshBeverage {
/**
* 制备饮料的模板方法
* 封装了所有子类共同遵循的算法框架
*/
public final void prepareBeverageTemplage(){
//步骤1将水煮沸
boilWater();
//步骤2泡制饮料
brew();
//步骤3将饮料倒入杯中
pourInCup();
if(isCustomerWantsCondiments()){
//步骤4加入调味料
addCondiments();
}
}
/**
* Hood,钩子函数,提供一个默认或空的实现
* 询问用户是否加入调料
* @return
*/
protected boolean isCustomerWantsCondiments() {
return true;
}
/**
* 基本方法,将水煮沸
*/
private void boilWater(){
System.out.println("将水煮沸");
}
/**
* 抽象的基本方法,泡制饮料
*/
protected abstract void brew();
/**
* 基本方法,将饮料倒入杯中
*/
private void pourInCup(){
System.out.println("将饮料倒入杯中");
}
/**
* 抽象基本方法,加入调味料
*/
protected abstract void addCondiments();
}
package com.test;
/**
* Created by admin on 2018/1/11.
*/
public class Tea extends RefreshBeverage{
@Override
protected void brew() {
System.out.println("用80度等的热水浸泡茶叶5分钟");
}
@Override
protected void addCondiments() {
System.out.println("加入柠檬");
}
}
咖啡类:
package com.test;
/**
* Created by admin on 2018/1/11.
*/
public class Coffee extends RefreshBeverage {
@Override
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加入糖和牛奶");
}
@Override
/**
* 子类选择覆盖的形式挂载钩子函数
*/
protected boolean isCustomerWantsCondiments(){
return false;
}
}
测试类:
package com.test;
/**
* Created by admin on 2018/1/11.
*/
public class Test {
public static void main(String[] args){
System.out.println("制备咖啡。。。");
RefreshBeverage b1=new Coffee();
b1.prepareBeverageTemplage();
System.out.println("咖啡好了。。。");
System.out.println("****************************");
System.out.println("制备茶。。。");
RefreshBeverage b2=new Tea();
b2.prepareBeverageTemplage();
System.out.println("茶好了");
}
}