模板方法模式
模板方法模式是面向?qū)ο笙到y(tǒng)中非常樸實(shí)的一種模式凹炸,體現(xiàn)出面向?qū)ο笤O(shè)計(jì)中繼承和多態(tài)的基本特征戏阅。在開(kāi)發(fā)應(yīng)用的過(guò)程中,往往會(huì)在初期規(guī)劃一些較粗粒度的算法啤它,而且對(duì)參與計(jì)算的對(duì)象進(jìn)行抽象奕筐,明確算法會(huì)使用到哪些方法,每個(gè)方法可以提供哪些支持变骡,但此時(shí)每個(gè)方法本身并沒(méi)有細(xì)化离赫;隨著開(kāi)發(fā)過(guò)程的展開(kāi),我們可能會(huì)具體實(shí)現(xiàn)每個(gè)方法塌碌,或者對(duì)最初的一些方法進(jìn)行替換渊胸,覆蓋上新的內(nèi)容,這樣就在一個(gè)相對(duì)固定的算法框架下台妆,通過(guò)子類(lèi)(或其他方法)的變化翎猛,實(shí)現(xiàn)了算法的差異性。
GOF對(duì)模板方法模式的描述為:
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method let ssubclasses redefine certain steps of an algorithm without changing the algorithm's structure..
— Design Patterns : Elements of Reusable Object-Oriented Software
UML類(lèi)圖:
代碼示例:
public abstract class Template
{
public abstract void Init();
public abstract void Start();
public abstract void End();
public void Process()
{
Init();
Start();
End();
}
}
public class ConcreteProcessor1 : Template
{
public override void End()
{
Console.WriteLine("Process1 End");
}
public override void Init()
{
Console.WriteLine("Process1 Init");
}
public override void Start()
{
Console.WriteLine("Process1 Start");
}
}
public class ConcreteProcessor2 : Template
{
public override void End()
{
Console.WriteLine("Process2 End");
}
public override void Init()
{
Console.WriteLine("Process2 Init");
}
public override void Start()
{
Console.WriteLine("Process2 Start");
}
}
適用場(chǎng)景
- 在實(shí)現(xiàn)一個(gè)算法時(shí)接剩,發(fā)現(xiàn)其中有些部分非常易變切厘,或者很容易隨著運(yùn)行環(huán)境、后續(xù)開(kāi)發(fā)的不同產(chǎn)生而很多變化懊缺,此時(shí)就按照模板方法模式可以把它們抽象出來(lái)疫稿,供子類(lèi)完成。
- 在需要對(duì)一系列子類(lèi)進(jìn)行約束鹃两,要求它們必須實(shí)現(xiàn)算法要求的某些方法時(shí)遗座,可以采用模板方法模式,便于其他客戶(hù)程序按照這些方法操作子類(lèi)俊扳。
優(yōu)點(diǎn)
1途蒋、封裝不變部分,擴(kuò)展可變部分拣度。 2碎绎、提取公共代碼螃壤,便于維護(hù)。 3筋帖、行為由父類(lèi)控制奸晴,子類(lèi)實(shí)現(xiàn)。
- 提高代碼復(fù)用性日麸,將相同部分的代碼放在抽象的父類(lèi)中 寄啼,而將不同的代碼放入不同的子類(lèi)中
- 提高了擴(kuò)展性,將不同的代碼放入不同的子類(lèi)中代箭,通過(guò)對(duì)子類(lèi)的擴(kuò)展增加新的行為
- 實(shí)現(xiàn)了反向控制墩划,通過(guò)一個(gè)父類(lèi)調(diào)用其子類(lèi)的操作,通過(guò)對(duì)子類(lèi)的擴(kuò)展增加新的行為嗡综,實(shí)現(xiàn)了反向控制乙帮,符合“開(kāi)閉原則”
缺點(diǎn)
每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類(lèi)來(lái)實(shí)現(xiàn),導(dǎo)致類(lèi)的個(gè)數(shù)增加极景,使得系統(tǒng)更加龐大察净。
參考書(shū)籍:
王翔著 《設(shè)計(jì)模式——基于C#的工程化實(shí)現(xiàn)及擴(kuò)展》