Franky's LIFE

          Anything... ...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            53 隨筆 :: 87 文章 :: 6 評論 :: 0 Trackbacks
          今天開始學習設計模式中的第三個類型——行為型模式。

          行為模式:

          行為型模式涉及到算法和對象間職責的分配。將注意力從控制流轉移到對象間的聯系方式上來。

          ?????? 行為模式分為:行為類模式和行為對象模式。行為類模式使用繼承機制在類間分派行為;行為對象模式使用對象復合而不是繼承。

          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());

          ??????? }

          }

          在這段代碼中,抽象方法StartUpRunStop叫做primitive operation(原語操作),它們是在子類中的擴展點,例如我們要編寫一輛BORA的實現,在他繼承AbstractCar后,可以在這幾個primitive operation上進行自己個步驟的實現。

          AbstractCar 中的DriveOnTheRoad方法叫做template method(模板方法),template methodprimitive 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(newBORA());

          ??????????? 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 ,因為需要重新定義的操作越多,客戶程序就越長

          posted on 2007-03-19 21:04 Franky 閱讀(154) 評論(0)  編輯  收藏 所屬分類: IT知識
          主站蜘蛛池模板: 上林县| 云和县| 同心县| 西和县| 喀什市| 枣阳市| 嘉定区| 开封市| 东丽区| 宜昌市| 民丰县| 赤城县| 巨鹿县| 平陆县| 扎鲁特旗| 汝阳县| 炎陵县| 象州县| 全州县| 潮州市| 临安市| 巴林右旗| 礼泉县| 商水县| 孝感市| 文水县| 沾益县| 福州市| 道真| 临颍县| 建宁县| 锦屏县| 灵石县| 商城县| 汉阴县| 山阴县| 盘山县| 余姚市| 平江县| 五华县| 柳江县|