Template Method模板方法模式

來源:互聯網
上載者:User
行為模式:

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.