模板方法设计模式

模式定义

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

示例

普通模板设计模式

/**
 * 咖啡因饮料
 *
 * @author Colin
 * @create 2018-05-14
 **/
public abstract class CaffeineBeverage {
    final void prepareRecipe(){
        boilWater();
        brew();
        pourIntoCup();
        addCondiments();
    }
    abstract void brew();
    abstract void addCondiments();
    void boilWater(){
        System.out.println("烧水");
    }
    void pourIntoCup(){
        System.out.println("饮料倒入杯子中");
    }
}


/**
 * 咖啡
 *
 * @author Colin
 * @create 2018-05-14
 **/
public class Coffee extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("冲泡咖啡");
    }

    @Override
    void addCondiments() {
        System.out.println("加糖和牛奶");
    }
}

/**
 * 茶
 *
 * @author Colin
 * @create 2018-05-14
 **/
public class Tea extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("冲泡茶叶");
    }

    @Override
    void addCondiments() {
        System.out.println("什么也不放");
    }
}

带钩子的模板设计模式,子类可以重写customerWantsCondiments控制父类模板方法

/**
 * 带钩子的饮料基类
 *
 * @author Colin
 * @create 2018-05-14
 **/
public abstract class CaffeineBeverageWithHook {
    final void prepareRecipe(){
        boilWater();
        brew();
        pourIntoCup();
        if (customerWantsCondiments()){
            addCondiments();
        }

    }
    abstract void brew();
    abstract void addCondiments();
    void boilWater(){
        System.out.println("烧水");
    }
    void pourIntoCup(){
        System.out.println("饮料倒入杯子中");
    }

    boolean customerWantsCondiments(){
        return  true;
    }
}

总结

  • 模板方法定义了算法步骤,将这些步骤延迟到子类中
  • 模板方法模式为我们提供了一种代码复用的技巧
  • 模板方法的抽象类可以定义具体方法,抽象方法和钩子
  • 钩子是一种方法,它在抽象类中不做事,子类可以选择要不要去覆盖它

涉及原则,好莱坞原则,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。

  • 别调用我们,我们会调用你

posted on 2018-05-14 22:37  colinzh  阅读(119)  评论(0)    收藏  举报

导航