模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到了子类中去,模板方法使得子类可以在不改变算法结构的基础上,重新定义算法中的某些步骤。
设计原则:好莱坞原则(别调用我们,我们会调用你)。顶层模块会主动调用底层模块,不要用底层模块去调用顶层模块。
基本结构:
public abstract class AbstractClass {
/**
* 模板方法: 声明为final ,不允许子类对其结构进行破坏
*/
public final void templateMethod() {
operate1();
operate2();
}
public abstract void operate1();
public abstract void operate2();
/**
* 该方法可以视情况添加
* 钩子【子类可以选择重写,主要作用是可以通过此方法控制上面的操作】
*/
public void hock() {
}
}
具体的例子:
public abstract class CoffeineBeverageWithHook {
/**
* 模板方法
* */
public final void prepare() {
brew();
if (customerWantCondiments()) {
addCondiments();
}
}
public abstract void brew();
public abstract void addCondiments();
/**
* 钩子方法
*/
public boolean customerWantCondiments() {
return true;
}
}
具体实现:
public class CoffeeWithHook extends CoffeineBeverageWithHook {
@Override
public void brew() {
System.out.println("brew...");
}
@Override
public void addCondiments() {
System.out.println("addCondiments beverage...");
}
@Override
public boolean customerWantCondiments() {
//input condition
String condition = "y";
if ("y".equals(condition)) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
CoffeeWithHook coffeeWithHook = new CoffeeWithHook();
coffeeWithHook.prepare();
}
}