【設計模式基礎】行為模式 - 6 - 模板方法(Template Method)

王曉斌發表於2014-02-15

1. 模式意圖

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

模板方法模式實際上是所有模式中最常用的幾個模式之一。


模板方法中的方法可以分為兩大類:模板方法(Template Method)基本方法(Primitive Method)

模板方法
{
    ... ...
	基本方法;
	
	基本方法;
	... ...
}


模板方法:

一個模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總演算法或一個總行為的方法。這個模板方法一般會在抽象類中定義,並由子類不加以修改地完全繼承下來。

基本方法:

基本方法又可以分為三種:抽象方法(Abstract Method),具體方法(Concrete Method),鉤子方法(Hook Method):

  • 抽象方法:一個抽象方法由抽象類宣告,由具體子類實現。
  • 具體方法:一個具體方法又抽象類宣告並實現,而子類並不實現或置換。
  • 鉤子方法:一個鉤子方法由抽象類宣告並實現,而子類會加以擴充套件。通常抽象類給出的實現是一個空實現,作為方法的預設實現,鉤子方法通常以do開頭。

2. 模式定義


抽象模板(Abstract Class):定義了一個或多個抽象操作(Primitive Method),以便讓子類實現;這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。定義並實現了一個模板方法,這個模板方法一般是一個具體方法,它給出一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能呼叫一些具體方法。

具體模板(Concrete Class):實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。


每一個抽象模板角色都可以有任意多個具體模板角色與之對應,而每一個具體模板角色都可以給出這些抽象方法的不同實現,從而使得頂級邏輯的實現各不相同。


3. 模式實現

3.1 C#實現模板方法

// Template Method pattern -- Structural example  
using System;

// "AbstractClass"
abstract class AbstractClass
{
  // Methods
  abstract public void PrimitiveOperation1();
  abstract public void PrimitiveOperation2();

  // The Template method
  public void TemplateMethod()
  {
    Console.WriteLine("In AbstractClass.TemplateMethod()");
    PrimitiveOperation1();
    PrimitiveOperation2();
  }
}

// "ConcreteClass"
class ConcreteClass : AbstractClass
{
  // Methods
  public override void PrimitiveOperation1()
  {
    Console.WriteLine("Called ConcreteClass.PrimitiveOperation1()");
  }

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

/// <summary>
/// Client test
/// </summary>
public class Client
{
  public static void Main( string[] args )
  {
    // Create instance and call template method
    ConcreteClass c = new ConcreteClass();
    c.TemplateMethod();
  }
}


4. 模式應用






相關文章