模板方法设计模式
模式定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,才重新定义算法中的某些步骤
示例
普通模板设计模式
/**
* 咖啡因饮料
*
* @author Colin
* @create 2018-05-14
**/
public abstract class CaffeineBeverage {
final void prepareRecipe(){
boilWater();
brew();
pourIntoCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater(){
System.out.println("烧水");
}
void pourIntoCup(){
System.out.println("饮料倒入杯子中");
}
}
/**
* 咖啡
*
* @author Colin
* @create 2018-05-14
**/
public class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("冲泡咖啡");
}
@Override
void addCondiments() {
System.out.println("加糖和牛奶");
}
}
/**
* 茶
*
* @author Colin
* @create 2018-05-14
**/
public class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("冲泡茶叶");
}
@Override
void addCondiments() {
System.out.println("什么也不放");
}
}
带钩子的模板设计模式,子类可以重写customerWantsCondiments控制父类模板方法
/**
* 带钩子的饮料基类
*
* @author Colin
* @create 2018-05-14
**/
public abstract class CaffeineBeverageWithHook {
final void prepareRecipe(){
boilWater();
brew();
pourIntoCup();
if (customerWantsCondiments()){
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater(){
System.out.println("烧水");
}
void pourIntoCup(){
System.out.println("饮料倒入杯子中");
}
boolean customerWantsCondiments(){
return true;
}
}
总结
- 模板方法定义了算法步骤,将这些步骤延迟到子类中
- 模板方法模式为我们提供了一种代码复用的技巧
- 模板方法的抽象类可以定义具体方法,抽象方法和钩子
- 钩子是一种方法,它在抽象类中不做事,子类可以选择要不要去覆盖它
涉及原则,好莱坞原则,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。
- 别调用我们,我们会调用你
浙公网安备 33010602011771号