Template Method
① 模板方法:在抽象类中定义一个稳定的算法骨架(如一个方法中有固定业务逻辑)
public abstract class AbstractTemplate {
// 稳定的骨架
public void getChampion(){
// 固定逻辑
dohookMethod();
System.out.println(show());
}
// 抽象方法,该方法由子类声明
protected abstract double doCalculateCore();
// 钩子方法,供子类必要时扩展(do开头命名)
protected void dohookMethod(){}
// 已经实现的方法
private String show(){
// 获取分数
double count = doCalculateCore();
return "结果分数为:"+ count;
}
}
② 具体类(重写父类的钩子方法进行扩展,实现父类抽象方法)
public class ConcreteClass extends AbstractTemplate {
// 子类实现父类的抽象方法
@Override
protected double doCalculateCore() {
return 1.80;
}
// 重写父类方法
@Override
protected void dohookMethod() {
System.out.println("子类进行扩展");
}
}
③ 多态
public static void main(String[] args) {
AbstractTemplate at = new ConcreteClass();
at.getChampion();
}
优点:相比直接在具体类上写getChampion,定义好的算法的骨架改动较少,更稳定,更具有复用价值。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
例 : HttpServlet(service方法)
思想:在确定稳定操作(项目)的前提下,灵活应用各个子部件(子模块)的变化
总结:Template Method中为很多应用程序框架提供灵活的扩展点(子类继承父类进行override)
(Library)不要调用我,让我来调用你(Application)【C++中的晚绑定】