Franky's LIFE

          Anything... ...

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            53 隨筆 :: 87 文章 :: 6 評(píng)論 :: 0 Trackbacks
          今天開(kāi)始學(xué)習(xí)設(shè)計(jì)模式中的第三個(gè)類(lèi)型——行為型模式。

          行為模式:

          行為型模式涉及到算法和對(duì)象間職責(zé)的分配。將注意力從控制流轉(zhuǎn)移到對(duì)象間的聯(lián)系方式上來(lái)。

          ?????? 行為模式分為:行為類(lèi)模式和行為對(duì)象模式。行為類(lèi)模式使用繼承機(jī)制在類(lèi)間分派行為;行為對(duì)象模式使用對(duì)象復(fù)合而不是繼承。

          Template Method 模板方法模式

          ?????? Template Method 模板方法模式介紹:

          ?????? Template Method 模板方法模式是一種行為型模式,具體點(diǎn)說(shuō)是行為類(lèi)型模式。主要解決在軟件構(gòu)建過(guò)程中,對(duì)于某一項(xiàng)任務(wù),常常有穩(wěn)定的整體操作結(jié)構(gòu),但各個(gè)子步驟卻有很多改變的需求,或者由于固有的原因而無(wú)法和任務(wù)的整體結(jié)構(gòu)同時(shí)實(shí)現(xiàn)。

          ?????? GoF 《設(shè)計(jì)模式》中說(shuō)道:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。 Template Method 使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟

          ?????? Template Method 模式的結(jié)構(gòu)


          ?????? 定義場(chǎng)景

          ?????? 單看結(jié)構(gòu)不好理解,我們來(lái)結(jié)合程序進(jìn)行分析。現(xiàn)在定義一個(gè)場(chǎng)景:我想大家都玩過(guò)極品飛車(chē)(我相當(dāng)喜歡)。游戲中有很多的汽車(chē),但是從操作角度看大同小異。無(wú)非是起步( StartUp )、行駛( Run )、停車(chē)( Stop )等等行為。汽車(chē)行駛的動(dòng)作之間可能存在著差異,例如:手動(dòng)檔和自動(dòng)檔,但是接口是一樣的,換句話說(shuō),基本都是這幾個(gè)動(dòng)作。結(jié)合 Template Method 模式講就是在這個(gè)程序中,結(jié)構(gòu)(對(duì)汽車(chē)的操作)是穩(wěn)定的,但是變化在于各個(gè)子步驟(操作行為的具體實(shí)現(xiàn))。

          ?????? 程序?qū)崿F(xiàn)與結(jié)構(gòu)分析

          ?????? 首先我們需要一個(gè)汽車(chē)的抽象類(lèi)(結(jié)構(gòu)圖中的 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(原語(yǔ)操作),它們是在子類(lèi)中的擴(kuò)展點(diǎn),例如我們要編寫(xiě)一輛BORA的實(shí)現(xiàn),在他繼承AbstractCar后,可以在這幾個(gè)primitive operation上進(jìn)行自己個(gè)步驟的實(shí)現(xiàn)。

          AbstractCar 中的DriveOnTheRoad方法叫做template method(模板方法),template methodprimitive operation定義一個(gè)算法,是相對(duì)穩(wěn)定的部分。(子類(lèi)中重新定義primitive operation)。

          ??? 然后我們要實(shí)現(xiàn)一輛BORA汽車(chē)(結(jié)構(gòu)圖中的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";

          ??????? }

          }

          接下來(lái)我們進(jìn)行客戶程序的實(shí)現(xiàn)

          class Program

          ??? {

          ??????? static void Main(string[] args)

          ??????? {

          ??????????? ClientApp.Drive(newBORA());

          ??????????? Console.Read();

          ??????? }

          }

          public class ClientApp

          ??? {

          ??????? public static void Drive(AbstractCar car)

          ??????? {

          ??????????? car.DriveOnTheRoad();

          ??????? }

          }

          運(yùn)行結(jié)果如下:

          BORA is StartUp

          BORA is Running

          BORA is Stoped

          ???


          Template Method 要點(diǎn)

          1、? Template Method 模式是一種非常基礎(chǔ)性的設(shè)計(jì)模式,在面向?qū)ο笙到y(tǒng)中有著大量的應(yīng)用。它用最簡(jiǎn)潔的機(jī)制(虛函數(shù)的多態(tài)性)為了很多應(yīng)用程序框架提供了靈活的擴(kuò)展點(diǎn),是代碼復(fù)用方面的基本實(shí)現(xiàn)結(jié)構(gòu)。

          2、? 除了可以靈活應(yīng)對(duì)子步驟的變化外,“ Don't call me.Let me Call you ”的反向控制結(jié)構(gòu)是 Template Method 的典型應(yīng)用。“ Don’t call me.Let me Call you ”是指一個(gè)父類(lèi)調(diào)用一個(gè)子類(lèi)的操作,而不是相反。

          3、? 在具體實(shí)現(xiàn)方面,被 Template Method 調(diào)用的虛方法可以具有實(shí)現(xiàn),也可以沒(méi)有任何實(shí)現(xiàn)(抽象方法、純虛方法),但一般推薦將它們?cè)O(shè)置為 protected 方法。可以沒(méi)有具體實(shí)現(xiàn)的方法應(yīng)該稱(chēng)為 hook operation (鉤子操作),提供了缺省的行為,子類(lèi)可以在必要時(shí)進(jìn)行擴(kuò)展。

          4、? 盡量減少 primitive operation ,因?yàn)樾枰匦露x的操作越多,客戶程序就越長(zhǎng)

          posted on 2007-03-19 21:04 Franky 閱讀(154) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): IT知識(shí)
          主站蜘蛛池模板: 丰宁| 札达县| 渝北区| 阿克| 纳雍县| 施秉县| 台安县| 湟中县| 扬中市| 常德市| 阿拉尔市| 禹城市| 马龙县| 崇文区| 莱西市| 余姚市| 淳安县| 漳浦县| 扬州市| 浙江省| 高台县| 蒙自县| 衡阳市| 济阳县| 固安县| 伊宁市| 丰都县| 宿松县| 大理市| 江都市| 临武县| 和林格尔县| 会泽县| 玉龙| 卫辉市| 晋宁县| 墨玉县| 台安县| 吴江市| 临澧县| 浠水县|