C#設計模式系列:模板方法模式(Template Method)

libingql發表於2014-04-01

  你去銀行取款的時候,銀行會給你一張取款單,這張取款單就是一個模板,它把公共的內容提取到模板中,只留下部分讓使用者來填寫。在軟體系統中,將多個類的共有內容提取到一個模板中的思想便是模板方法模式的思想。

  模板方法模式是基於繼承的程式碼複用基本技術,在模板方法模式中,可以將相同的程式碼放在父類中,而將不同的方法實現放在不同的子類中。

  在模板方法模式中,需要準備一個抽象類,將部分邏輯以具體方法以及具體建構函式形式實現,然後宣告一些抽象方法來讓子類實現剩餘邏輯。不同的子類可以以不同的方式實現這些抽象方法。

1.1>、定義

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

1.2>、使用頻率

   中等

2、模板方法模式結構

2.1>、結構圖

2.2>、參與者

  模板方法模式參與者:

  ◊ AbstractClass:定義一個模板,其子類將重定義PrimitiveOperation1和PrimitiveOperation2操作。

  ◊ ConcreteClass:實現PrimitiveOperation1和PrimitiveOperation2以完成演算法中與特定子類(Client)相關的內容。

  在模板方法模式中,AbstractClass中的TemplateMethod提供了一個標準模板,該模板包含PrimitiveOperation1和PrimitiveOperation2兩個方法,這兩個方法的內容Client可以根據自己的需要重寫。

3、模板方法模式結構實現

  AbstractClass.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.TemplateMethodPattern.Structural
{
    public abstract class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        /// <summary>
        /// The "Template method"
        /// </summary>
        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("");
        }
    }
}

  ConcreteClassA.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.TemplateMethodPattern.Structural
{
    public class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
        }
    }
}

  ConcreteClassB.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.TemplateMethodPattern.Structural
{
    public class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
        }
    }
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DesignPatterns.TemplateMethodPattern.Structural;

namespace DesignPatterns.TemplateMethodPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractClass aA = new ConcreteClassA();
            aA.TemplateMethod();

            AbstractClass aB = new ConcreteClassB();
            aB.TemplateMethod();
        }
    }
}

  執行輸出:

ConcreteClassA.PrimitiveOperation1()
ConcreteClassA.PrimitiveOperation2()

ConcreteClassB.PrimitiveOperation1()
ConcreteClassB.PrimitiveOperation2()

請按任意鍵繼續. . .

4、模板方法模式應用分析

  模板方法模式適用情形:

  ◊ 一次性實現一個演算法的不變部分,並將可變的行為留給子類來實現。

  ◊ 各子類中公共的行為應被提取出來並集中到一個公共父類中以避免程式碼重複。

  ◊ 控制子類擴充套件。模板方法只允許在特定點進行擴充套件,而模板部分則是穩定的。

  模板方法模式特點:

  ◊ TemplateMethod模式是一種非常基礎性的設計模式,在物件導向系統中大量應用。它用最簡潔的機制(基礎、多型)為很多應用程式框架提供了靈活的擴充套件點,是程式碼複用方面的基本實現結構。

  ◊ 在具體實現方面,被TemplateMethod呼叫的虛方法可以具有實現,也可以沒有任何實現(抽象方法或虛方法)。但一般推薦將它們設定為protected方法使得只有子類可以訪問它們。

  ◊ 模板方法模式通過對子類的擴充套件增加新的行為,符合“開閉原則”。

相關文章