把「模板方法」應用到實際項目中

閱讀原文:把「模板方法」應用到實際項目中java

若是不在工做中思考,模板方法模式的概念和定義即便背再多遍估計也是徒勞,今天我思考如何解決實際項目中的問題時發現,模板方法正是解決問題的良策。面試

需求

咱們項目中要實現一個建立會議的需求,但咱們系統可設置將會議同步到其餘第三方系統中。而在建立會議前要通過幾個必須的步驟,好比驗證衝突,計算循環規則,對比時間段是否符合等。算法

思路

不一樣點

建立會議的方式不一樣:架構

  • 本地系統建立
  • 第三方系統建立

相同點

  1. 驗證會議是否衝突
  2. 根據循環規則計算出預約時間段
  3. 是否符合預約規則

特殊點

即便會議又衝突,但有需求是依然要能建立成功!因此驗證衝突步驟是可選的。ide

業務梳理後以下:spa

開始抽象

只有抽象類能實現咱們的要求,既能要一部分方法有實現又能實現抽象方法不用實現。3d

@Slf4j
public abstract class AbstarctRecurringHandler {

    /**
     * 處理建立會議
     */
    public final void handle() {
        if (isConfirm()) {
            calculateConflict();
        }
        calcBookingPeriod();
        checkRule();
        createEvent();
    }

    /**
     * 驗證規則
     */
    public void checkRule() {}

    /**
     * 獲取預約的全部會議時間段
     *
     * @return
     */
    public List<Period> calcBookingPeriod() {}

    /**
     * 計算衝突會議
     */
    public void calculateConflict() {}

    /**
     * 鉤子方法
     *
     * @return
     */
    public abstract boolean isConfirm();

    public abstract void createEvent();
}
  • 模板方法

咱們這裏的handle方法已經固定了整個建立會議的流程,而且咱們使用final修飾,表示不容許別人修改這個過程。
不一樣的建立可能有不一樣的人來完成,這個可以避免部分人員的粗枝大葉也就是規範了建立流程,並且其餘開發人員也沒必要再關心除建立會議以外的其餘過程。code

  • 鉤子方法

雖然咱們的建立會議的總體過程不容許修改,但部分功能可能有所不一樣,因此咱們須要鉤子方法來使部分功能可選或者改變部分流程。鉤子方法可以使用默認值,也可由子類來決定是否改變。視頻

兩種不一樣的實現

兩個子類惟一的職責就只剩單純的建立功能。token

  • 本地建立
@Slf4j
@Service
public class LocalRecurringHandler extends AbstarctRecurringHandler {

    /**
     * 鉤子方法
     *
     * @return
     */
    @Override
    public boolean isConfirm() {
        return true;
    }

    @Override
    public void createEvent() {
        //建立本地會議
    }

}
  • 第三方建立
@Slf4j
@Service
public class EwsRecurringHandler extends AbstarctRecurringHandler {

    /**
     * 鉤子方法
     *
     * @return
     */
    @Override
    public boolean isConfirm() {
        return false;
    }

    @Override
    public void createEvent() {
        //建立本地會議
    }

}

模板方法定義

定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。

角色

模板方法模式涉及到的角色有:

  • 抽象模板角色

    定義一組基本方法供子類實現,定義並實現組合了基本方法的模板方法。

  • 具體模板角色

    實現抽象模板角色定義的基本方法。

總結

好處

  • 提升代碼的複用性

    相同的代碼放到了抽象類中,複用且可維護性強。

  • 具備必定的擴展性

    不一樣的實現交由子類來自行實現,用子類來進行擴展。

  • 反向控制

    行爲由父類控制,子類實現。

實踐要在理論的基礎之上,因此理論基礎也是很是重要的。

往期文章一覽

  1. 把「策略模式」應用到實際項目中
  2. 造個輪子,我學到了什麼
  3. 技術面試中的軟技能

關注 「碼上實戰」 回覆 :面試視頻 和 架構師 送你很是不錯的資料。

相關文章
相關標籤/搜索