定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类不用改变算法骨架而重新定义某些特定步骤,是基于继承的一种代码复用技术。
实现:定义一个抽象类,提取出子类的公共方法,放到抽象类中,并在抽象类中定义一个模板方法,在模板方法中规定基本方法的执行顺序,将不同的实现细节交给子类去完成
使用场景:在多个子类拥有相同的方法,并且这些方法的逻辑相同,细节不同时可以考虑使用模板方法
优点:容易扩展,方便更改子类和增加新的子类,便于维护,每一个子类实现单一职责,主要逻辑在父类中实现,修改子类不会影响到父类,公共的行为放到父类中, 提高了代码复用
缺点:每个不同的实现需要定义一个子类,导致类的个数增加
栗子:Acitivity生命周期函数
public abstract class Cook {
public final void cook() { // 模板方法
beforeCook();
cooking();
afterCook();
}
protected void beforeCook() {
// do prepare thing
}
protected void afterCook() {
// do clean thing
}
protected abstract void cooking();
}
public class NoodleCook extends Cook {
protected void cooking() {
System.out.print("noodle cook");
}
}
public class RiceCook extends Cook {
protected void cooking() {
System.out.print("rice cook");
}
}
public class Test {
public static void main(Stirng[] args) {
NoodleCook noodle = new NoodleCook();
noodle.cook();
RiceCook rice = new RiceCook();
rice.cook();
}
}