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