日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式學(xué)習(xí)筆記(十六)——Template Method模板方法模式

 skywood 2007-08-06

       今天開始學(xué)習(xí)設(shè)計(jì)模式中的第三個(gè)類型——行為型模式。

行為模式:

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

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

Template Method模板方法模式

       Template Method模板方法模式介紹:

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

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

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


       定義場(chǎng)景

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

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

       首先我們需要一個(gè)汽車的抽象類(結(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());

        }

}

在這段代碼中,抽象方法StartUpRun、Stop叫做primitive operation(原語操作),它們是在子類中的擴(kuò)展點(diǎn),例如我們要編寫一輛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)定的部分。(子類中重新定義primitive operation)。

    然后我們要實(shí)現(xiàn)一輛BORA汽車(結(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";

        }

}

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

class Program

    {

        static void Main(string[] args)

        {

            ClientApp.Drive(new BORA());

            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模式是一種非?;A(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è)父類調(diào)用一個(gè)子類的操作,而不是相反。

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

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多