Template Method
定义
模板方法模式是类的行为模式。
在一个方法中定义一个算法的骨架,将一些算法的具体步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
结构和角色
AbstractClass 这个抽象类包含了一个模板方法,和抽象方法,具体方法,钩子方法。
ConcreteClass 这个具体类继承上面的抽象类,实现抽象方法。此具体类可以有多个。
package ds.templatemethod; public abstract class AbstractClass { // 模板方法, 用final 修饰是为了防止子类覆盖此方法,而改变算法的结构 public final void templateMethod() { abstractMethod1(); abstractMethod2(); abstractMethod3(); // 这里是钩子方法, if (hookMethod()) { concreteMethod(); } } public abstract void abstractMethod1(); public abstract void abstractMethod2(); public abstract void abstractMethod3(); public void concreteMethod() { } public boolean hookMethod() { return true; } }
package ds.templatemethod; public class ConcreteClass extends AbstractClass { @Override public void abstractMethod1() { System.out.println("abstractMethod1 ... "); } @Override public void abstractMethod2() { System.out.println("abstractMethod2 ... "); } @Override public void abstractMethod3() { System.out.println("abstractMethod3 ... "); } }
模仿servlet 中的模板方法模式 ..
模板方法中的方法
模板方法模式的方法可以分为两类:模板方法(Template Method),基本方法。
模板方法:这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变。
基本方法:可以分为三种,抽象方法(Abstract Method)、具体方法(Concrete Method)、钩子方法(Hook Method)
抽象方法:由抽象类声明,由具体子类实现。
具体方法:由抽象类声明并实现,子类可以选择不实现或覆盖。
钩子方法:由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
*钩子方法,这个方法很有技巧。它可以让子类有能力对算法的不同点进行挂钩。(钩子方法的名字应该以do开始)
设计原则
"好莱坞原则" : 不要给我们打电话,我们会给你打。
好莱坞原则体现了模板方法的关键 : 子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。
每当定义一个新的子类时,不要按照控制流程的思想去想,而应当按照"责任"的思想去想。换言之,应当考虑有哪些操作时必须置换掉的,哪些原则是可以置换掉的,以及哪些操作是不可以置换掉的。使用模板方法模式可以使这些责任变得清晰。