摘要:從李淵開國(guó)看模板方法模式假如史書記載沒有水分的話,那么相對(duì)于其他開國(guó)皇帝,李淵的難度最低,畢竟什么事情都交給他兒子干就完事了。而李世民則接受李淵的調(diào)遣,負(fù)責(zé)實(shí)現(xiàn)各個(gè)細(xì)節(jié)。模板方法模式是抽象與實(shí)踐分離的又一個(gè)經(jīng)典實(shí)踐。
Template Method: 從李淵開國(guó)看模板方法模式
假如史書記載沒有水分的話,那么相對(duì)于其他開國(guó)皇帝,李淵的難度最低,畢竟什么事情都交給他兒子干就完事了。
從晉陽(yáng)起兵,李淵父子用了七年時(shí)間,先后消滅薛舉父子、李軌、宋金剛、劉武周、王世充、竇建德、蕭銑、杜伏威和梁師都等割據(jù)勢(shì)力。
其中薛舉父子、宋金剛、劉武周、王世充、竇建德、杜伏威(招降)、梁師都都是被李世民擊敗的。
那么我們把李淵開國(guó)用Java代碼描述就是:
abstract class 李淵{ abstract void 消滅薛舉父子(); abstract void 消滅李軌(); abstract void 消滅宋金剛(); abstract void 消滅劉武周(); abstract void 消滅王世充(); abstract void 消滅竇建德(); void 消滅蕭銑(){ System.out.println("消滅了蕭銑"); } abstract void 召降杜伏威(); abstract void 消滅梁師都(); }
然后你可以看到,除了消滅蕭銑,我把其他方法都寫成了抽象方法,因?yàn)槲覀冎肋@些事都不是李淵自己直接做的。
那么李淵想建立唐朝的話,他只需要一個(gè)個(gè)調(diào)用方法就行了
abstract class 李淵{ abstract void 消滅薛舉父子(); abstract void 消滅李軌(); abstract void 消滅宋金剛(); abstract void 消滅劉武周(); abstract void 消滅王世充(); abstract void 消滅竇建德(); void 消滅蕭銑(){ System.out.println("消滅了蕭銑"); } abstract void 召降杜伏威(); abstract void 消滅梁師都(); public void 建立唐朝(){ 消滅薛舉父子(); 消滅李軌(); 消滅宋金剛(); 消滅劉武周(); 消滅王世充(); 消滅竇建德(); 消滅蕭銑(); 召降杜伏威(); 消滅梁師都(); System.out.println("李唐建立了"); } }
簡(jiǎn)單的來說就是這樣的。但是真的想開國(guó)的話,不能只有抽象方法啊,還必須一步一步的真正的實(shí)現(xiàn)上面的方法,這時(shí)候李世民就來了。李世民作為李淵的兒子,直接繼承父類就行了。
class 李世民 extends 李淵{ @Override void 消滅薛舉父子() { System.out.println("消滅薛舉父子"); } @Override void 消滅李軌() { System.out.println("消滅李軌"); } @Override void 消滅宋金剛() { System.out.println("消滅宋金剛"); } @Override void 消滅劉武周() { System.out.println("消滅劉武周"); } @Override void 消滅王世充() { System.out.println("消滅王世充"); } @Override void 消滅竇建德() { System.out.println("消滅竇建德"); } @Override void 召降杜伏威() { System.out.println("召降杜伏威"); } @Override void 消滅梁師都() { System.out.println("消滅梁師都"); } }
我們的李世民類實(shí)現(xiàn)了李淵沒有實(shí)現(xiàn)的方法。
然后我們來測(cè)試下建立唐朝
public class Test { public static void main(String[] args) { 李淵 liYuan = new 李世民(); liYuan.建立唐朝(); } }
額李淵 liYuan = new 李世民();這個(gè)語(yǔ)句邏輯上看著有點(diǎn)怪異啊,不過意思就是這個(gè)意思吧。
作為父類的李淵,給出了統(tǒng)一天下的整體戰(zhàn)略,而具體實(shí)施的細(xì)節(jié)就是交給子類來,讓我們的代碼依賴于抽象而不是具體的實(shí)現(xiàn),這是軟件工程中的經(jīng)典做法。
假如另一個(gè)時(shí)空,沒有李世民,那么李淵也可以讓其他子女替他完成各個(gè)戰(zhàn)略,比如這樣的
class 平陽(yáng)公主 extends 李淵{ @Override void 消滅薛舉父子() { System.out.println("平陽(yáng)公主了消滅薛舉父子"); } // ... } public class Test { public static void main(String[] args) { 李淵 liYuan = new 平陽(yáng)公主(); liYuan.建立唐朝(); } }
模板方法的核心在于為了完成一件事情(比如建立唐朝),很有可能需要做大量的事情。
但是如果讓一個(gè)類包含實(shí)現(xiàn)這個(gè)目的所用到所有的細(xì)節(jié),會(huì)讓代碼很臃腫。我們把抽象和實(shí)現(xiàn)分離。李淵作為總指揮官,負(fù)責(zé)全局戰(zhàn)略上的全局調(diào)度,但是不負(fù)責(zé)細(xì)節(jié)的實(shí)現(xiàn)。而李世民則接受李淵的調(diào)遣,負(fù)責(zé)實(shí)現(xiàn)各個(gè)細(xì)節(jié)。
模板方法模式是抽象與實(shí)踐分離的又一個(gè)經(jīng)典實(shí)踐。
原文發(fā)布于github
https://github.com/fish-stack...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75444.html
摘要:示例如下靜態(tài)路由使用動(dòng)態(tài)變量的路由未指定變量類型使用動(dòng)態(tài)變量的路由指定變量類型指定的路由變量,可以作為被裝飾的函數(shù)參數(shù)傳入進(jìn)來。 開始決定認(rèn)真的在網(wǎng)上寫一些東西,主要原因還是在于希望能提升學(xué)習(xí)效果。雖說python寫了有幾年,但是web后端框架的確沒怎么接觸過,買了本狗書寥寥草草的過了一遍,發(fā)現(xiàn)很多東西還是理解不深,真的是好記性不如爛筆頭,知識(shí)也要從基礎(chǔ)開始,退回來好好看看官方文檔,再...
摘要:綁定到子組件屬性綁定到父組件屬性在子組件模板內(nèi)將指令綁定到子組件屬性列表第一項(xiàng),由于父組件找不到屬性,將不會(huì)顯示。哪都通快遞龍虎山天師府曜星社內(nèi)容分發(fā)中的被插入中,并且因?yàn)橹械闹噶疃M(jìn)行迭代,迭代之后通過獲取上的屬性數(shù)據(jù)。 組件的作用域(一) 父組件模板的內(nèi)容在父組件作用域內(nèi)編譯;子組件模板的內(nèi)容在子組件作用域內(nèi)編譯。 父子組件的編譯相互獨(dú)立,編譯時(shí)只能使用各自作用域中的屬性和方法,例...
摘要:綁定到子組件屬性綁定到父組件屬性在子組件模板內(nèi)將指令綁定到子組件屬性列表第一項(xiàng),由于父組件找不到屬性,將不會(huì)顯示。哪都通快遞龍虎山天師府曜星社內(nèi)容分發(fā)中的被插入中,并且因?yàn)橹械闹噶疃M(jìn)行迭代,迭代之后通過獲取上的屬性數(shù)據(jù)。 組件的作用域(一) 父組件模板的內(nèi)容在父組件作用域內(nèi)編譯;子組件模板的內(nèi)容在子組件作用域內(nèi)編譯。 父子組件的編譯相互獨(dú)立,編譯時(shí)只能使用各自作用域中的屬性和方法,例...
摘要:具體可配置的項(xiàng)可以參看其源代碼。那引擎對(duì)象是如何被構(gòu)造出來的呢看這句由此,我們進(jìn)入了的核心構(gòu)造函數(shù),。由于該構(gòu)造函數(shù)篇幅很長(zhǎng),我們先看下簡(jiǎn)略版的結(jié)構(gòu),然后拆開來分析。此外,推薦使用注冊(cè)自定義函數(shù),而非使用。 Juicer.js源碼解讀 Version: 0.6.9-stable Date: 8th of Aug, 2015 個(gè)人能力有限,如有分析不當(dāng)?shù)牡胤剑瑧┱?qǐng)指...
摘要:分發(fā)處理器將會(huì)掃描使用了該注解的類的方法,并檢測(cè)該方法是否使用了注解。作用該注解用于將的方法返回的對(duì)象,通過適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫入到對(duì)象的數(shù)據(jù)區(qū)。用于注解層,在類上面注解。使用標(biāo)記的參數(shù)。 1、@Controller 在SpringMVC 中,控制器Controller 負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請(qǐng)求,它把用戶請(qǐng)求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個(gè)M...
閱讀 2595·2023-04-25 17:37
閱讀 1261·2021-11-24 10:29
閱讀 3789·2021-09-09 11:57
閱讀 771·2021-08-10 09:41
閱讀 2302·2019-08-30 15:55
閱讀 2873·2019-08-30 15:54
閱讀 2015·2019-08-30 15:53
閱讀 964·2019-08-30 15:43