行為模式:
行為型模式涉及到算法和對象間職責的分配。將注意力從控制流轉移到對象間的聯系方式上來。
行為模式分為:行為類模式和行為對象模式。行為類模式使用繼承機制在類間分派行為;行為對象模式使用對象復合而不是繼承。
Template Method模板方法模式
Template Method模板方法模式介紹:
Template Method模板方法模式是一種行為型模式,具體點說是行為類型模式。主要解決在軟件構建過程中,對于某一項任務,常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由于固有的原因而無法和任務的整體結構同時實現。
GoF《設計模式》中說道:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
Template Method模式的結構
定義場景
單看結構不好理解,我們來結合程序進行分析。現在定義一個場景:我想大家都玩過極品飛車(我相當喜歡)。游戲中有很多的汽車,但是從操作角度看大同小異。無非是起步(StartUp)、行駛(Run)、停車(Stop)等等行為。汽車行駛的動作之間可能存在著差異,例如:手動檔和自動檔,但是接口是一樣的,換句話說,基本都是這幾個動作。結合Template Method模式講就是在這個程序中,結構(對汽車的操作)是穩定的,但是變化在于各個子步驟(操作行為的具體實現)。
程序實現與結構分析
首先我們需要一個汽車的抽象類(結構圖中的AbstractClass)
public abstract class AbstractCar
{
protected abstract string StartUp();
protected abstract string Run();
protected abstract string Stop();
public void DriveOnTheRoad()
{
Console.WriteLine(StartUp());
Console.WriteLine(Run());
Console.WriteLine(Stop());
}
}
在這段代碼中,抽象方法StartUp、Run、Stop叫做primitive operation(原語操作),它們是在子類中的擴展點,例如我們要編寫一輛BORA的實現,在他繼承AbstractCar后,可以在這幾個primitive operation上進行自己個步驟的實現。
AbstractCar中的DriveOnTheRoad方法叫做template method(模板方法),template method用primitive operation定義一個算法,是相對穩定的部分。(子類中重新定義primitive operation)。
然后我們要實現一輛BORA汽車(結構圖中的ConcreteClass)
public class BORA : AbstractCar //繼承
{
protected override string StartUp()
{
return "BORA is StartUp";
}
protected override string Run()
{
return "BORA is Running";
}
protected override string Stop()
{
return "BORA is Stoped";
}
}
接下來我們進行客戶程序的實現
class Program
{
static void Main(string[] args)
{
ClientApp.Drive(new BORA());
Console.Read();
}
}
public class ClientApp
{
public static void Drive(AbstractCar car)
{
car.DriveOnTheRoad();
}
}
運行結果如下:
BORA is StartUp
BORA is Running
BORA is Stoped
Template Method要點
1、 Template Method模式是一種非常基礎性的設計模式,在面向對象系統中有著大量的應用。它用最簡潔的機制(虛函數的多態性)為了很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
2、 除了可以靈活應對子步驟的變化外,“Don't call me.Let me Call you”的反向控制結構是Template Method的典型應用。“Don’t call me.Let me Call you”是指一個父類調用一個子類的操作,而不是相反。
3、 在具體實現方面,被Template Method調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設置為protected方法。可以沒有具體實現的方法應該稱為hook operation(鉤子操作),提供了缺省的行為,子類可以在必要時進行擴展。
4、 盡量減少primitive operation,因為需要重新定義的操作越多,客戶程序就越長
行為型模式涉及到算法和對象間職責的分配。將注意力從控制流轉移到對象間的聯系方式上來。
行為模式分為:行為類模式和行為對象模式。行為類模式使用繼承機制在類間分派行為;行為對象模式使用對象復合而不是繼承。
Template Method模板方法模式
Template Method模板方法模式介紹:
Template Method模板方法模式是一種行為型模式,具體點說是行為類型模式。主要解決在軟件構建過程中,對于某一項任務,常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由于固有的原因而無法和任務的整體結構同時實現。
GoF《設計模式》中說道:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
Template Method模式的結構
定義場景
單看結構不好理解,我們來結合程序進行分析。現在定義一個場景:我想大家都玩過極品飛車(我相當喜歡)。游戲中有很多的汽車,但是從操作角度看大同小異。無非是起步(StartUp)、行駛(Run)、停車(Stop)等等行為。汽車行駛的動作之間可能存在著差異,例如:手動檔和自動檔,但是接口是一樣的,換句話說,基本都是這幾個動作。結合Template Method模式講就是在這個程序中,結構(對汽車的操作)是穩定的,但是變化在于各個子步驟(操作行為的具體實現)。
程序實現與結構分析
首先我們需要一個汽車的抽象類(結構圖中的AbstractClass)
public abstract class AbstractCar
{
protected abstract string StartUp();
protected abstract string Run();
protected abstract string Stop();
public void DriveOnTheRoad()
{
Console.WriteLine(StartUp());
Console.WriteLine(Run());
Console.WriteLine(Stop());
}
}
在這段代碼中,抽象方法StartUp、Run、Stop叫做primitive operation(原語操作),它們是在子類中的擴展點,例如我們要編寫一輛BORA的實現,在他繼承AbstractCar后,可以在這幾個primitive operation上進行自己個步驟的實現。
AbstractCar中的DriveOnTheRoad方法叫做template method(模板方法),template method用primitive operation定義一個算法,是相對穩定的部分。(子類中重新定義primitive operation)。
然后我們要實現一輛BORA汽車(結構圖中的ConcreteClass)
public class BORA : AbstractCar //繼承
{
protected override string StartUp()
{
return "BORA is StartUp";
}
protected override string Run()
{
return "BORA is Running";
}
protected override string Stop()
{
return "BORA is Stoped";
}
}
接下來我們進行客戶程序的實現
class Program
{
static void Main(string[] args)
{
ClientApp.Drive(new BORA());
Console.Read();
}
}
public class ClientApp
{
public static void Drive(AbstractCar car)
{
car.DriveOnTheRoad();
}
}
運行結果如下:
BORA is StartUp
BORA is Running
BORA is Stoped
Template Method要點
1、 Template Method模式是一種非常基礎性的設計模式,在面向對象系統中有著大量的應用。它用最簡潔的機制(虛函數的多態性)為了很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
2、 除了可以靈活應對子步驟的變化外,“Don't call me.Let me Call you”的反向控制結構是Template Method的典型應用。“Don’t call me.Let me Call you”是指一個父類調用一個子類的操作,而不是相反。
3、 在具體實現方面,被Template Method調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設置為protected方法。可以沒有具體實現的方法應該稱為hook operation(鉤子操作),提供了缺省的行為,子類可以在必要時進行擴展。
4、 盡量減少primitive operation,因為需要重新定義的操作越多,客戶程序就越長