1. 程式人生 > >【設計模式】——模板模式

【設計模式】——模板模式

【模板模式】

定義了一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的特定步驟

在模板模式中,一個抽象類公開的定義了執行他的方法的方式。他的子類可以按需求重寫方法實現,但呼叫將以抽象類中的定義的方式進行。屬於行為型模式

 

【介紹】

 

  • 主要解決:一些方法通用,卻在每一個子類都重寫了這一方法

  • 何時使用:有一些通用的方法

  • 如何解決:將這些通用演算法抽象出來

  • 關鍵程式碼:在抽象類中實現,其他步驟在子類實現

  • 優點:1、封裝不變部分,擴充套件可變部分;2、提取公共程式碼,便於維護;3、行為由父類控制,子類實現

  • 缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統變得龐大

  • 使用場景:1、有多個子類共有的方法,且邏輯相同;2、重要的、複雜的方法,可以考慮作為模板方法

  • 注意事項:為防止惡意操作,一般模板方法都加上final關鍵詞

 

【實現】

 

 

步驟一:Abstrctclass抽象類


 

abstract class AbstractClass

    {

        //抽象行為,到子類中實現

        public abstract void PrimitiveOperation1();

        public abstract void PrimitiveOperation2();

        //模板方法,給出了邏輯骨架,而邏輯的組成是一些相應的抽象操作,都推遲到子類實現

        public void TemplateMethod()

        {

            PrimitiveOperation1();

            PrimitiveOperation2();

            Console.WriteLine("");

        }

    }

步驟二:Concreteclass,實現父類所定義的一個或多個抽象方法

class ConcreteClassA:AbstractClass

    {

        public override void PrimitiveOperation1()

        {

            Console.WriteLine("具體類A方法1實現");//與ConcreteClassB不同的方法實現

        }

        public override void PrimitiveOperation2()

        {

            Console.WriteLine("具體類A方法2實現");

        }

    }

    class ConcreteClassB:AbstractClass

    {

        public override void PrimitiveOperation1()

        {

            Console.WriteLine("具體類B方法1實現");

        }

        public override void PrimitiveOperation2()

        {

            Console.WriteLine("具體類B方法2實現");

        }

    }

 

步驟三:客戶端呼叫

 

static void Main(string[] args)

        {

            AbstractClass c;

            c = new ConcreteClassA();

            c.TemplateMethod();



            c = new ConcreteClassB();

            c.TemplateMethod();

            Console.Read();

        }

【總結】

 

模板模式是通過把不變行為搬移到超類,去除子類中的重複程式碼來體現它的優勢

模板模式提供了一個很好的程式碼複用平臺

 

當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重複出現。通過模板模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重複的不變行為的糾纏