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开始)

 

设计原则

  "好莱坞原则" : 不要给我们打电话,我们会给你打。

  好莱坞原则体现了模板方法的关键 : 子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。

  每当定义一个新的子类时,不要按照控制流程的思想去想,而应当按照"责任"的思想去想。换言之,应当考虑有哪些操作时必须置换掉的,哪些原则是可以置换掉的,以及哪些操作是不可以置换掉的。使用模板方法模式可以使这些责任变得清晰。

 

posted @ 2014-04-13 22:01  廖东海  阅读(183)  评论(0编辑  收藏  举报