1:什麼是模板方法
定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
2:為什麼要使用模板方法
在程式設計中,有時很多物件有共同的操作,比如乙個汽車物件,發動汽車需要啟動->行駛->鳴笛->停車等程式化步驟,不同的車輛型別都有這些步驟,如果在每個物件都定義一次,那麼就會造成**的重複,此時我們就需要模板方法來解決這個問題。模板設計模式思路:是把相同的部分抽象出來到抽象類中去定義,具體子類來繼承抽象類,並實現抽象類中的抽象方法,從而達到具體實現的不同部分,這個思路也正式模板方法的實現精髓所在。
3:模板方法的優點和缺點
優點:
● 封裝不變部分,擴充套件可變部分
把認為是不變部分的演算法封裝到父類實現,而可變部分的則可以通過繼承來繼續擴充套件。
● 提取公共部分**,便於維護
● 行為由父類控制,子類實現
基本方法是由子類實現的,因此子類可以通過擴充套件的方式增加相應的功能,符合開閉原則。
缺點:
按照我們的設計習慣,抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類完成具體的事物屬性和方法。但是模板方法模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行的結果影響了父類的結果,也就是子類對父類產生了影響,這在複雜的專案中,會帶來**閱讀的難度,而且也會讓新手產生不適感。
4:模板方法的使用場景
● 多個子類有公有的方法,並且邏輯基本相同時。
● 重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子類實現。
● 重構時,模板方法模式是乙個經常使用的模式,把相同的**抽取到父類中,然後通過鉤子函式約束其行為。
5:模板類的例項.
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace template
}public
abstract
class human
}public
class student : human
public
override
void
weakup()
public
override
void
work()
}public
class worker : human
public
override
void
weakup()
public
override
void
work()
}}
從上例可以看出,不管學生還是工人都有統一的流程,即醒來,吃飯,工作,只是具體的細節不同,所以這裡設計為模板方法。
注意 抽象模板中的基本方法盡量設計為protected型別,符合迪公尺特法則,不需要暴露的屬性或方法盡量不要設定為protected型別。實現類若非必要,盡量不要擴大父類中的訪問許可權。
6:其實作為學生是不需要工作的,那模板類能否自己判斷要要工作呢?答案是肯定的,模板方法的擴充套件例項如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace template
}public
abstract
class human
}//鉤子方法,預設人都需要工作
protected
abstract
bool
iswork();
}public
class student : human
protected
override
void
weakup()
protected
override
void
work()
//要不要工作,是由外部決定的
public
void
setwork(bool iswork)
protected
override
bool
iswork()
}public
class worker : human
protected
override
void
weakup()
protected
override
void
work()
public
void
setwork(bool iswork)
protected
override
bool
iswork()
}}
輸出結果為:
**學生類****
我是學生我睡懶覺起不來!
我是學生我睡懶覺不吃早飯!
**工人類****
我是工人起很早!
我是工人吃早飯!
我是工人努力工作!
我們可以看到模板類可以自己判斷是否執行某些操作。
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...