电竞比分网-中国电竞赛事及体育赛事平台

分享

設(shè)計(jì)模式(14) 模板方法模式

 頭號(hào)碼甲 2021-07-14

模板方法模式

模板方法模式是面向?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)圖:
模板方法模式 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ò)展》

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多