行為模式:
行為型模式涉及到算法和對象間職責(zé)的分配。將注意力從控制流轉(zhuǎn)移到對象間的聯(lián)系方式上來。
??????
行為模式分為:行為類模式和行為對象模式。行為類模式使用繼承機制在類間分派行為;行為對象模式使用對象復(fù)合而不是繼承。
Template Method
模板方法模式
?????? Template Method
模板方法模式介紹:
?????? Template Method
模板方法模式是一種行為型模式,具體點說是行為類型模式。主要解決在軟件構(gòu)建過程中,對于某一項任務(wù),常常有穩(wěn)定的整體操作結(jié)構(gòu),但各個子步驟卻有很多改變的需求,或者由于固有的原因而無法和任務(wù)的整體結(jié)構(gòu)同時實現(xiàn)。
?????? GoF
《設(shè)計模式》中說道:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
Template Method
使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟
??????
Template Method
模式的結(jié)構(gòu)
??????
定義場景
??????
單看結(jié)構(gòu)不好理解,我們來結(jié)合程序進行分析。現(xiàn)在定義一個場景:我想大家都玩過極品飛車(我相當喜歡)。游戲中有很多的汽車,但是從操作角度看大同小異。無非是起步(
StartUp
)、行駛(
Run
)、停車(
Stop
)等等行為。汽車行駛的動作之間可能存在著差異,例如:手動檔和自動檔,但是接口是一樣的,換句話說,基本都是這幾個動作。結(jié)合
Template Method
模式講就是在這個程序中,結(jié)構(gòu)(對汽車的操作)是穩(wěn)定的,但是變化在于各個子步驟(操作行為的具體實現(xiàn))。
??????
程序?qū)崿F(xiàn)與結(jié)構(gòu)分析
??????
首先我們需要一個汽車的抽象類(結(jié)構(gòu)圖中的
AbstractClass
)
??????
public
abstract
class
AbstractCar
??? {
???????
protected
abstract
string StartUp();
???????
protected
abstract
string Run();
???????
protected
abstract
string Stop();
???????
public
void DriveOnTheRoad()
??????? {
???????????
Console.WriteLine(StartUp());
???????????
Console.WriteLine(Run());
???????????
Console.WriteLine(Stop());
??????? }
}
在這段代碼中,抽象方法StartUp、Run、Stop叫做primitive operation(原語操作),它們是在子類中的擴展點,例如我們要編寫一輛BORA的實現(xiàn),在他繼承AbstractCar后,可以在這幾個primitive operation上進行自己個步驟的實現(xiàn)。
AbstractCar
中的DriveOnTheRoad方法叫做template method(模板方法),template method用primitive operation定義一個算法,是相對穩(wěn)定的部分。(子類中重新定義primitive operation)。
???
然后我們要實現(xiàn)一輛BORA汽車(結(jié)構(gòu)圖中的ConcreteClass)
???
public
class
BORA : AbstractCar
??? {
???????
protected
override
string StartUp()
??????? {
???????????
return
"BORA is StartUp";
??????? }
???????
protected
override
string Run()
?????
??{
???????????
return
"BORA is Running";
??????? }
???????
protected
override
string Stop()
??????? {
???????????
return
"BORA is Stoped";
??????? }
}
接下來我們進行客戶程序的實現(xiàn)
class
Program
??? {
???????
static
void
??????? {
???????????
ClientApp.Drive(newBORA());
???????????
Console.Read();
??????? }
}
public
class
ClientApp
??? {
???????
public
static
void Drive(AbstractCar car)
??????? {
??????????? car.DriveOnTheRoad();
??????? }
}
運行結(jié)果如下:
BORA is StartUp
BORA is Running
BORA is Stoped
???
Template Method
要點
1、?
Template Method
模式是一種非常基礎(chǔ)性的設(shè)計模式,在面向?qū)ο笙到y(tǒng)中有著大量的應(yīng)用。它用最簡潔的機制(虛函數(shù)的多態(tài)性)為了很多應(yīng)用程序框架提供了靈活的擴展點,是代碼復(fù)用方面的基本實現(xiàn)結(jié)構(gòu)。
2、?
除了可以靈活應(yīng)對子步驟的變化外,“
Don't call me.Let me Call you
”的反向控制結(jié)構(gòu)是
Template Method
的典型應(yīng)用。“
Don’t call me.Let me Call you
”是指一個父類調(diào)用一個子類的操作,而不是相反。
3、?
在具體實現(xiàn)方面,被
Template Method
調(diào)用的虛方法可以具有實現(xiàn),也可以沒有任何實現(xiàn)(抽象方法、純虛方法),但一般推薦將它們設(shè)置為
protected
方法。可以沒有具體實現(xiàn)的方法應(yīng)該稱為
hook operation
(鉤子操作),提供了缺省的行為,子類可以在必要時進行擴展。
4、? 盡量減少 primitive operation ,因為需要重新定義的操作越多,客戶程序就越長