1. 程式人生 > >設計模式之模板方法(Template Method)

設計模式之模板方法(Template Method)

老板 就是 iam pre 一起 完成 nbsp str 記錄學習

  在整理模板方法之前,先來說點廢話吧。除了記錄學習總結,也來記錄一下生活吧。

  我們公司的老板在北京,老板也會因為項目來公司,不過不是天天來。公司有個同事,只要老板不在就天天遲到,而且一天比一天晚,經常來了公司沒多久,午飯的外賣就送到公司了。前幾天,外賣竟然比他還來的早(外賣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、當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重復出現。通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重復的不變行為的糾纏。

  

設計模式之模板方法(Template Method)