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