摘要:閱讀原文把模板方法應(yīng)用到實際項目中如果不在工作中思考,模板方法模式的概念和定義即使背再多遍估計也是徒勞,今天我思考如何解決實際項目中的問題時發(fā)現(xiàn),模板方法正是解決問題的良策。
閱讀原文:把「模板方法」應(yīng)用到實際項目中
如果不在工作中思考,模板方法模式的概念和定義即使背再多遍估計也是徒勞,今天我思考如何解決實際項目中的問題時發(fā)現(xiàn),模板方法正是解決問題的良策。
需求我們項目中要實現(xiàn)一個創(chuàng)建會議的需求,但我們系統(tǒng)可設(shè)置將會議同步到其他第三方系統(tǒng)中。而在創(chuàng)建會議前要經(jīng)過幾個必須的步驟,比如驗證沖突,計算循環(huán)規(guī)則,對比時間段是否符合等。
思路 不同點創(chuàng)建會議的方式不同:
本地系統(tǒng)創(chuàng)建
第三方系統(tǒng)創(chuàng)建
相同點驗證會議是否沖突
根據(jù)循環(huán)規(guī)則計算出預(yù)定時間段
是否符合預(yù)定規(guī)則
特殊點即使會議又沖突,但有需求是依然要能創(chuàng)建成功!所以驗證沖突步驟是可選的。
業(yè)務(wù)梳理后如下:
開始抽象只有抽象類能實現(xiàn)我們的要求,既能要一部分方法有實現(xiàn)又能實現(xiàn)抽象方法不用實現(xiàn)。
@Slf4j public abstract class AbstarctRecurringHandler { /** * 處理創(chuàng)建會議 */ public final void handle() { if (isConfirm()) { calculateConflict(); } calcBookingPeriod(); checkRule(); createEvent(); } /** * 驗證規(guī)則 */ public void checkRule() {} /** * 獲取預(yù)定的所有會議時間段 * * @return */ public ListcalcBookingPeriod() {} /** * 計算沖突會議 */ public void calculateConflict() {} /** * 鉤子方法 * * @return */ public abstract boolean isConfirm(); public abstract void createEvent(); }
模板方法
我們這里的handle方法已經(jīng)固定了整個創(chuàng)建會議的流程,并且我們使用final修飾,表示不允許別人修改這個過程。
不同的創(chuàng)建可能有不同的人來完成,這個能夠避免部分人員的粗心大意也就是規(guī)范了創(chuàng)建流程,而且其他開發(fā)人員也不必再關(guān)心除創(chuàng)建會議之外的其他過程。
鉤子方法
雖然我們的創(chuàng)建會議的整體過程不允許修改,但部分功能可能有所不同,所以我們需要鉤子方法來使部分功能可選或者改變部分流程。鉤子方法可使用默認值,也可由子類來決定是否改變。
兩種不同的實現(xiàn)兩個子類唯一的職責(zé)就只剩單純的創(chuàng)建功能。
本地創(chuàng)建
@Slf4j @Service public class LocalRecurringHandler extends AbstarctRecurringHandler { /** * 鉤子方法 * * @return */ @Override public boolean isConfirm() { return true; } @Override public void createEvent() { //創(chuàng)建本地會議 } }
第三方創(chuàng)建
@Slf4j @Service public class EwsRecurringHandler extends AbstarctRecurringHandler { /** * 鉤子方法 * * @return */ @Override public boolean isConfirm() { return false; } @Override public void createEvent() { //創(chuàng)建本地會議 } }模板方法定義
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
角色模板方法模式涉及到的角色有:
抽象模板角色
定義一組基本方法供子類實現(xiàn),定義并實現(xiàn)組合了基本方法的模板方法。
具體模板角色
實現(xiàn)抽象模板角色定義的基本方法。
總結(jié) 好處提高代碼的復(fù)用性
相同的代碼放到了抽象類中,復(fù)用且可維護性強。
具有一定的擴展性
不同的實現(xiàn)交由子類來自行實現(xiàn),用子類來進行擴展。
反向控制
行為由父類控制,子類實現(xiàn)。
實踐要在理論的基礎(chǔ)之上,所以理論基礎(chǔ)也是非常重要的。
往期文章一覽把「策略模式」應(yīng)用到實際項目中
造個輪子,我學(xué)到了什么
技術(shù)面試中的軟技能
關(guān)注 「碼上實戰(zhàn)」 回復(fù) :面試視頻 和 架構(gòu)師 送你非常不錯的資料。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74374.html
摘要:原文地址如果您對本系列文章感興趣,歡迎關(guān)注訂閱這里前言上文多頁應(yīng)用架構(gòu)系列十二利用生成普通網(wǎng)頁頁面模板我們基本上已經(jīng)搞清楚如何利用來生成普通網(wǎng)頁頁面模板,本文將以我的腳手架項目介紹如何在這基礎(chǔ)上搭建一套簡單的模板布局系統(tǒng)。 本文首發(fā)于Array_Huang的技術(shù)博客——實用至上,非經(jīng)作者同意,請勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/1190000007...
摘要:在此之前我們已經(jīng)編寫了的首頁視圖,并且配置了和模板,讓能夠正確地處理請求并返回合適的響應(yīng)。正確引入了靜態(tài)文件后樣式顯示正常了。在真正的博客首頁視圖追夢人物的博客的評論區(qū)留言。更多教程,請訪問追夢人物的博客。 在此之前我們已經(jīng)編寫了 Blog 的首頁視圖,并且配置了 URL 和模板,讓 Django 能夠正確地處理 HTTP 請求并返回合適的 HTTP 響應(yīng)。不過我們僅僅在首頁返回了一句...
摘要:回到純靜態(tài)頁面開發(fā)階段,讓頁面不需要后端渲染也能跑起來。改造開始本文著重介紹如何將靜態(tài)頁面改造成后端渲染需要的模板。總結(jié)在后端渲染的項目里使用多頁應(yīng)用架構(gòu)是絕對可行的,可不要給老頑固們嚇唬得又回到傳統(tǒng)前端架構(gòu)了。 本文首發(fā)于Array_Huang的技術(shù)博客——實用至上,非經(jīng)作者同意,請勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000820338...
摘要:回到純靜態(tài)頁面開發(fā)階段,讓頁面不需要后端渲染也能跑起來。改造開始本文著重介紹如何將靜態(tài)頁面改造成后端渲染需要的模板。總結(jié)在后端渲染的項目里使用多頁應(yīng)用架構(gòu)是絕對可行的,可不要給老頑固們嚇唬得又回到傳統(tǒng)前端架構(gòu)了。 本文首發(fā)于Array_Huang的技術(shù)博客——實用至上,非經(jīng)作者同意,請勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000820338...
摘要:核心的幾個組件模板引擎,框架,請求和應(yīng)答的處理還是有一些難度,但是經(jīng)過一步步的分析和編碼還是能夠完成功能。模板引擎模板引擎是另外一個比較大和的模塊。 前前后后,大概兩個月的時間,lunar這個項目終于達到了一個很高的完整度。 Lunar是一個Python語言的網(wǎng)絡(luò)框架,類似于Django,F(xiàn)lask,Tornado等當下流行的web framework。最初有這個想法是在大二下學(xué)期,...
閱讀 3270·2021-11-15 11:37
閱讀 1078·2021-11-02 14:45
閱讀 3902·2021-09-04 16:48
閱讀 3578·2019-08-30 15:55
閱讀 754·2019-08-23 17:53
閱讀 1000·2019-08-23 17:03
閱讀 2032·2019-08-23 16:43
閱讀 2188·2019-08-23 16:22