提到“模板”不知道別人想到的是什么,我想到的是可復用,與此提供同時可復用又是面向對象編程和設計模式要達到的目的。所以模板方法模式作為一種設計模式也自然是理所應當的啦。其實,模板方法模式是一種比較簡單的設計模式,看看具體的吧:
1.初識模板方法模式
讀了這么多年書,大家或多或少都遇到過這樣的情況吧:老師在黑板上寫了一些題,讓學生記下去,然后寫答案在交上來。(還記得那個時候我近視看不清黑板的痛苦啊,那個時候我只能別人抄完了,我在照他們抄。)其實這就是模板方法模式能夠解決的問題了,分析一下我們便知道大家每個人抄的題應該都是一樣的吧,只有答案可能不一樣,要是大家抄的選擇題,那么不一樣的東西就只有一個答案,區別可能就是A,B,C,D。可是每個人卻都要抄一遍題,要是遇到一個我這樣的近視,還可能把題抄錯了。這就體現出來模板方法模式的重要性了,建立一個模板類,類中包括:模板方法和子類實現的方法。這里模板方法為題目+答案(調用類中的答案方法),子類實現的方法就是答案方法,這樣做就避免了每個子類總都包含題目,使得每個子類中只需要包含答案。說恐怕怎么說也不直觀,還是看看代碼實現吧。
模板方法模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
2.模板方法模式應用舉例
看看具體的模板類和具體實現是怎么實現的吧:
1 class TestpaperTemplate 2 { 3 public : 4 void templateMethod()//模板方法,定義了要完成操作的骨架 5 { 6 question1(); 7 answer1(); 8 question2(); 9 answer2(); 10 }; 11 void question1() 12 { 13 cout<<"問題一:二叉樹每個節點兒子節點數目有多少:\n"; 14 cout<<"A.最多1個 B.最多兩個 C.任意多個 D.至少一個"; 15 }; 16 void question2() 17 { 18 cout<<"問題二:完全二叉樹葉子節點可能在哪一層:\n"; 19 cout<<"A.任意一層 B.最后一層 C.最后兩層 D.最后三層"; 20 }; 21 protected: 22 virtual void answer1();//這兩個方法的具體實現延時到子類,因不同的類而不同 23 virtual void answer2(); 24 }; 25 26 class StudentA :public TestpaperTemplate 27 { 28 virtual void answer1() 29 { 30 cout<<"答案:B"<<endl<<endl; 31 } 32 virtual void answer2() 33 { 34 cout<<"答案:A"<<endl<<endl; 35 } 36 }; 37 class StudentB :public TestpaperTemplate 38 { 39 //此處和StudentA中類似,只是每個學生選擇的答案不同 40 };
這樣一來,每個學生只需要寫自己的答案就好了,避免抄題這種無用功了。
3.使用模板方法模式的場合和好處
模板方法模式是通過把不變的行為搬移到超類,去除子類中的重復代碼來體現它的優勢的。也就提供了一個很好的代碼復用平台。如果以后遇到這種情況:有一個過程需要執行,這個過程包括一系列步驟,整個過程從高層次看是一樣的,但是每個步驟的具體細節不一樣,這時我們就可以考慮這種模板方法模式了。即當不變的行為和可變的行為在類中混在一起的時候,不變的行為就會在子類中重復出現,這是通過模板方法模式把這些行為搬移到單一的地方實現(超類),而把不同的部分在子類實現,這就使子類擺脫了重復的不變行為的困擾。
應用實例:HttpServlet類提供了一個service()方法.這個方法調用了一個或是多個do方法,完成對客戶端發起的請求的處理,這些do方法則是由具體的HttpServlet類提供的.那么這里的service()方法就是一個摸板方法.
學習中的一點總結,歡迎拍磚哦^^