比别人多一点执着,你就会创造奇迹。
本讲内容:模板方法模式
一、模板方法模式 Template 介绍
模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现,使得子类可以在不改变一个算法结构的同时,就重新定义该算法的某些特定步骤。
二、用抽象基类定义框架
1.创建抽象类
---public abstract class Beverage
2.创建模版方法
---public final void prepareBeverageTemplate()
---boilWater();
---brew();
---pourInCup();
---addCondiments();
3.实现并私有化基本方法(固定的)
---private
4.添加抽象的基本方法(知道具体原则,不确定实现细节,由子类实现)
---protected abstract protected 使其他类(非继承的)不可直接调用
三、用钩子函数实现子类对算法框架个性化的扩展
1、思想:框架通过提供一个个的钩子,使框架具备了更大的灵活性。不想执行算法框架中的某些个步骤,我们可以脱钩,如果想执行的话,我们可以挂钩。
2、实现:在抽象类中,提供protected钩子方法。这是个实现的或空的方法。这样子类就可以选择覆写-持钩,也可以选择不覆写-脱勾。
3、使用:提供一个isXXX类型的钩子方法。用该方法控制算法框架中
4、某个步骤是否执行:子类不覆写这个方法,就是脱钩,仍按框架逻辑执行,一旦覆写,就是挂钩,将改变框架算法方向,按子类逻辑执行。
示例一:饮料泡法
1、把水煮沸(boilWater) 固定的
2、泡饮料(brew) 可变的(不知其泡什么饮料) 知道具体原则,不确定实现细节,使子类实现
3、把饮料倒进杯子(pourInCup) 固定的
4、加调味料(addCondiments) 可变的(不知其加什么味料)
/*
* 抽象基类,为所有子类提供一个算法框架
*
* 饮料
*/
public abstract class Beverage {
/*
* 制备饮料的模板方法 封装了所有子类共同遵循的算法框架
*/
public final void prepareBeverageTemplate() {
// 步骤1 将水煮沸
boilWater();
// 步骤2 泡制饮料
brew();
// 步骤3 将饮料倒入杯中
pourInCup();
if(isCondiments()){
//步骤4 加入调味料
addCondiments();
}
}
/*
* 基本方法,将水煮沸
*/
private void boilWater() {
System.out.println("将水煮沸");
}
/*
* 抽象的基本方法,泡制饮料
*/
protected abstract void brew();
/*
* 基本方法,将饮料倒入杯中
*/
private void pourInCup() {
System.out.println("将饮料倒入杯中");
}
/*
* 抽象的基本方法, 加入调味料
*/
protected abstract void addCondiments();
/*
* Hook, 钩子函数,提供一个默认或空的实现
* 具体的子类可以自行决定是否挂钩以及如何挂钩
* 询问用户是否加入调料
*/
protected boolean isCondiments(){
return true;
}
}
/*
* 具体子类,提供了咖啡制备的具体实现
*/
public class Coffee extends Beverage {
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
protected void addCondiments() {
System.out.println("加入糖和牛奶");
}
}
/*
* 具体子类,提供了制备茶的具体实现
*/
public class Tea extends Beverage {
protected void brew() {
System.out.println("用80度的热水浸泡茶叶5分钟");
}
protected void addCondiments() {
System.out.println("加入柠檬");
}
/*
* 子类通过覆盖的形式选择挂载钩子函数(返回 false 使饮料不添加味料)
*/
protected boolean isCondiments() {
return false;
}
}
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
System.out.println("制备咖啡...");
Beverage b1=new Coffee();
b1.prepareBeverageTemplate();
System.out.println("咖啡好了!");
System.out.println("\n******************************************");
System.out.println("制备茶...");
Beverage b2=new Tea();
b2.prepareBeverageTemplate();
System.out.println("茶好了!");
}
}
打印:
制备咖啡...
将水煮沸
用沸水冲泡咖啡
将饮料倒入杯中
加入糖和牛奶
咖啡好了!
******************************************
制备茶...
将水煮沸
用80度的热水浸泡茶叶5分钟
将饮料倒入杯中
茶好了!
Take your time and enjoy it