在整理模板方法之前,先來說點廢話吧。除了記錄學習總結,也來記錄一下生活吧。 我們公司的老闆在北京,老闆也會因為項目來公司,不過不是天天來。公司有個同事,只要老闆不在就天天遲到,而且一天比一天晚,經常來了公司沒多久,午飯的外賣就送到公司了。前幾天,外賣竟然比他還來的早(外賣11點半送到的),公司一個不 ...
在整理模板方法之前,先來說點廢話吧。除了記錄學習總結,也來記錄一下生活吧。
我們公司的老闆在北京,老闆也會因為項目來公司,不過不是天天來。公司有個同事,只要老闆不在就天天遲到,而且一天比一天晚,經常來了公司沒多久,午飯的外賣就送到公司了。前幾天,外賣竟然比他還來的早(外賣11點半送到的),公司一個不怎麼說廢話的同事說了一句“兵馬未動,糧草先行”。其他同事都覺得他說的很是到位。
模板方法模式的定義
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
我的理解是,在一個較為通用的流程中或步驟中,只有具體的某個步驟可能是不相同的。比如,實現一個“我下麵給你吃……”,首先把水倒入鍋里,第二步下麵,最後把面從鍋里撈出來。這個流程是固定的,但是可能第二部在南方和北方就不一樣了,比如北方人吃刀削麵,所以下的是刀削麵,南方人吃的是熱乾麵,所以第二步下的是熱乾麵。也就是具體的面不一樣了,而整個的流程演算法是相同的。
代碼示例
1 public class TemplateMethod { 2 public static void main(String[] args) { 3 System.out.println("南方人下麵給你吃"); 4 NanFang nf = new NanFang(); 5 nf.zhuMian();; 6 7 System.out.println("++++++++++++++++++++++++"); 8 9 System.out.println("北方人下麵給你吃"); 10 BeiFang bf = new BeiFang(); 11 bf.zhuMian(); 12 } 13 } 14 15 abstract class Mian { 16 17 public void zhuMian() { 18 System.out.println("把水倒入鍋里"); 19 xiaMian(); 20 System.out.println("把面從鍋里撈出來"); 21 System.out.println("面給你吃"); 22 } 23 24 public abstract void xiaMian(); 25 } 26 27 class NanFang extends Mian { 28 public void xiaMian() { 29 System.out.println("熱乾麵"); 30 } 31 } 32 33 class BeiFang extends Mian { 34 public void xiaMian() { 35 System.out.println("刀削麵"); 36 } 37 }
編譯運行如下圖所示:
總結
總結來自於《大話設計模式》一書中第十章“考題抄錯會做也白搭——模板方法模式”。
1、既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重覆的代碼都應該要上升到父類去,而不是讓每個子類都去重覆;
2、當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,我們通常考慮用模板方法模式來處理;
3、模板方法模式是通過把不變行為搬移到超類,去除子類中的重覆代碼來體現它的優勢;
4、當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重覆出現。通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重覆的不變行為的糾纏。