閱讀原文: 把「模板方法」應用到實際項目中java
若是不在工做中思考,模板方法模式的概念和定義即便背再多遍估計也是徒勞,今天我思考如何解決實際項目中的問題時發現,模板方法正是解決問題的良策。面試
咱們項目中要實現一個建立會議的需求,但咱們系統可設置將會議同步到其餘第三方系統中。而在建立會議前要通過幾個必須的步驟,好比驗證衝突,計算循環規則,對比時間段是否符合等。算法
建立會議的方式不一樣:架構
即便會議又衝突,但有需求是依然要能建立成功!因此驗證衝突步驟是可選的。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
雖然咱們的建立會議的總體過程不容許修改,但部分功能可能有所不一樣,因此咱們須要鉤子方法來使部分功能可選或者改變部分流程。鉤子方法可以使用默認值,也可由子類來決定是否改變。cdn
兩個子類惟一的職責就只剩單純的建立功能。視頻
@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() {
//建立本地會議
}
}
複製代碼
定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
模板方法模式涉及到的角色有:
抽象模板角色
定義一組基本方法供子類實現,定義並實現組合了基本方法的模板方法。
具體模板角色
實現抽象模板角色定義的基本方法。
提升代碼的複用性
相同的代碼放到了抽象類中,複用且可維護性強。
具備必定的擴展性
不一樣的實現交由子類來自行實現,用子類來進行擴展。
反向控制
行爲由父類控制,子類實現。
實踐要在理論的基礎之上,因此理論基礎也是很是重要的。
關注 「碼上實戰」 回覆 :面試視頻 和 架構師 送你很是不錯的資料。