模板方法設計模式

模式定義

在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠在不改變算法結構的狀況下,才從新定義算法中的某些步驟java

示例

普通模板設計模式算法

/**
 * 咖啡因飲料
 *
 * @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;
    }
}

總結

  • 模板方法定義了算法步驟,將這些步驟延遲到子類中
  • 模板方法模式爲咱們提供了一種代碼複用的技巧
  • 模板方法的抽象類能夠定義具體方法,抽象方法和鉤子
  • 鉤子是一種方法,它在抽象類中不作事,子類能夠選擇要不要去覆蓋它ide

    涉及原則,好萊塢原則,咱們容許低層組件將本身掛鉤到系統上,可是高層組件會決定何時和怎樣使用這些低層組件。設計

  • 別調用咱們,咱們會調用你code

相關文章
相關標籤/搜索