【设计模式】模板方法模式

定义

在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

优点

  • 模板类主导一切,拥有且保护算法。算法修改方便。
  • 新增加一个实现类,只需要重写自己的方法就可以了。
  • 模板类专注算法本身,由子类提供完整的实现。

定义一个模板

/**
 * 定义的抽象类,它被声明为抽象,作为基类
 */
public abstract class AbstractClass {
    /**
     * 模板方法,定义了该方法包含的一连串操作
     */
    final void templateMethod(){
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation1();
        concreteOperation2();
    }

    /**
     * 操作1:需子类实现具体操作
     */
    abstract void primitiveOperation1();

    /**
     * 操作2:需子类实现具体操作
     */
    abstract void primitiveOperation2();

    /**
     * 具体方法,子类无法重写
     */
    final void concreteOperation1(){
        //do something
    }

    /**
     * 具体方法,子类视情况是否重写
     */
    void concreteOperation2(){
        //do something
    }
}

模板中增加钩子

钩子是以重被声明在抽象类中的方法,可以让子类有能力对算法的不同点进行挂钩。

/**
 * 定义的抽象类,它被声明为抽象,作为基类
 */
public abstract class AbstractClassWithHook {
    /**
     * 模板方法,定义了该方法包含的一连串操作
     */
    final void templateMethod(){
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation1();

        //满足某条件才执行操作2
        if (matchAnyCondition()) {
            concreteOperation2();
        }
    }

    /**
     * 操作1:需子类实现具体操作
     */
    abstract void primitiveOperation1();

    /**
     * 操作2:需子类实现具体操作
     */
    abstract void primitiveOperation2();

    /**
     * 具体方法,子类无法重写
     */
    final void concreteOperation1(){
        //do something
    }

    /**
     * 具体方法,子类视情况是否重写
     */
    void concreteOperation2(){
        //do something
    }

    /**
     * 自定义的钩子,子类可以覆盖这个方法,根据实际条件返回true or false
     * @return
     */
    boolean matchAnyCondition() {
        //return true or false,子类可以重写
        return true;
    }
}

【参考】
[1] Head First 设计模式
[2] https://github.com/iluwatar/java-design-patterns/tree/master/template-method

你可能感兴趣的:(模板方法,设计模式,java)