小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

行為型模式之模板方法

 頭號碼甲 2021-07-12

在面向?qū)ο蟪绦蛟O(shè)計過程中,程序員常常會遇到這種情況:設(shè)計一個系統(tǒng)時知道了算法所需的關(guān)鍵步驟,而且確定了這些步驟的執(zhí)行順序,但某些步驟的具體實現(xiàn)還未知,或者說某些步驟的實現(xiàn)與具體的環(huán)境相關(guān)。
例如,一個人每天會起床、吃飯、做事、睡覺等,其中“做事”的內(nèi)容每天可能不同。我們把這些規(guī)定了流程或格式的實例定義成模板,允許使用者根據(jù)自己的需求去更新它,例如,簡歷模板、論文模板、Word 中模板文件等。

定義與特點

模板方法(Template Method)模式的定義如下:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。它是一種類行為型模式。

該模式的主要優(yōu)點如下:

  • 封裝了不變部分,擴展可變部分。它把認(rèn)為是不變部分的算法封裝到父類中實現(xiàn),而把可變部分算法由子類繼承實現(xiàn),便于子類繼續(xù)擴展。

  • 它在父類中提取了公共的部分代碼,便于代碼復(fù)用。

  • 部分方法是由子類實現(xiàn)的,因此子類可以通過擴展方式增加相應(yīng)的功能,符合開閉原則

該模式的主要缺點如下:

  • 對每個不同的實現(xiàn)都需要定義一個子類,這會導(dǎo)致類的個數(shù)增加,系統(tǒng)更加龐大,設(shè)計也更加抽象。

  • 父類中的抽象方法由子類實現(xiàn),子類執(zhí)行的結(jié)果會影響父類的結(jié)果,這導(dǎo)致一種反向的控制結(jié)構(gòu),它提高了代碼閱讀的難度。

結(jié)構(gòu)與實現(xiàn)

模板方法模式需要注意抽象類與具體子類之間的協(xié)作。它用到了虛函數(shù)的多態(tài)性技術(shù)以及“不用調(diào)用我,讓我來調(diào)用你”的反向控制技術(shù)

模式的結(jié)構(gòu)

模板方法模式包含以下主要角色:

抽象類(Abstract Class):負(fù)責(zé)給出一個算法的輪廓和骨架。它由一個模板方法和若干個基本方法構(gòu)成,這些方法的定義如下:

  • 模板方法:定義了算法的骨架,按某種順序調(diào)用其包含的基本方法。

  • 基本方法:是整個算法中的一個步驟,包含以下幾種類型:

  • 抽象方法:在抽象類中申明,由具體子類實現(xiàn)

  • 具體方法:在抽象類中已經(jīng)實現(xiàn),在具體子類中可以繼承或重寫它。

  • 鉤子方法:在抽象類中已經(jīng)實現(xiàn),包括用于判斷的邏輯方法和需要子類重寫的空方法兩種

具體子類(Concrete Class):實現(xiàn)抽象類中所定義的抽象方法和鉤子方法,它們是一個頂級邏輯的一個組成步驟。

模板方法模式的結(jié)構(gòu)圖如圖所示:

模式的實現(xiàn)

模板方法模式的代碼如下:

class Program
{    
    static void Main(string[] args)
    {
        AbstractClass tm=new ConcreteClass();
        tm.TemplateMethod();
        
        Console.Read();
    }
}

//抽象類
public abstract class AbstractClass
{
    public void TemplateMethod() //模板方法
    {
        SpecificMethod();
        AbstractMethod1();          
        AbstractMethod2();
    }  
    public void SpecificMethod() //具體方法
    {
        Console.WriteLine("抽象類中的具體方法被調(diào)用...");
    }   
    public abstract void AbstractMethod1(); //抽象方法1
    public abstract void AbstractMethod2(); //抽象方法2
}

//具體子類
public class ConcreteClass : AbstractClass
{
    public override void AbstractMethod1()
    {
        Console.WriteLine("抽象方法1的實現(xiàn)被調(diào)用...");
    }
    public override void AbstractMethod2()
    {
        Console.WriteLine("抽象方法2的實現(xiàn)被調(diào)用...");
    }
}

程序的運行結(jié)果如下:

抽象類中的具體方法被調(diào)用...
抽象方法1的實現(xiàn)被調(diào)用...
抽象方法2的實現(xiàn)被調(diào)用...

應(yīng)用場景

模板方法模式通常適用于以下場景:

  • 算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現(xiàn)。

  • 當(dāng)多個子類存在公共的行為時,可以將其提取出來并集中到一個公共父類中以避免代碼重復(fù)。首先,要識別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個調(diào)用這些新的操作的模板方法來替換這些不同的代碼。

  • 當(dāng)需要控制子類的擴展時,模板方法只在特定點調(diào)用鉤子操作,這樣就只允許在這些點進行擴展。

擴展:重寫鉤子方法

在模板方法模式中,基本方法包含:抽象方法、具體方法和鉤子方法,正確使用“鉤子方法”可以使得子類控制父類的行為。如下面例子中,可以通過在具體子類中重寫鉤子方法 HookMethod1() 和 HookMethod2() 來改變抽象父類中的運行結(jié)果,其結(jié)構(gòu)圖如圖所示:

程序代碼如下:

class Program
{    
    static void Main(string[] args)
    {
        HookAbstractClass tm = new HookConcreteClass();
        tm.TemplateMethod();
        
        Console.Read();
    }
}

//含鉤子方法的抽象類
public abstract class HookAbstractClass
{
    public void TemplateMethod() //模板方法
    {
        AbstractMethod1();
        HookMethod1();
        if(HookMethod2())
        {
            SpecificMethod();   
        }
         AbstractMethod2();
    }  
    public void SpecificMethod() //具體方法
    {
        Console.WriteLine("抽象類中的具體方法被調(diào)用...");
    }
    public virtual void HookMethod1(){}  //鉤子方法1
    public virtual bool HookMethod2() //鉤子方法2
    {
        return true;
    }
    public abstract void AbstractMethod1(); //抽象方法1
    public abstract void AbstractMethod2(); //抽象方法2
}

//含鉤子方法的具體子類
public class HookConcreteClass : HookAbstractClass
{
    public override void AbstractMethod1()
    {
        Console.WriteLine("抽象方法1的實現(xiàn)被調(diào)用...");
    }
    public override void AbstractMethod2()
    {
        Console.WriteLine("抽象方法2的實現(xiàn)被調(diào)用...");
    }
    public override void HookMethod1()
    {
        Console.WriteLine("鉤子方法1被重寫...");
    }
    public override bool HookMethod2()
    {
        return false;
    }
}

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多