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

分享

設計模式學習筆記(十)——Decorator裝飾模式

 skywood 2007-08-06

Decorator裝 飾模式是一種結構型模式,它主要是解決:“過度地使用了繼承來擴展對象的功能”,由于繼承為類型引入的靜態(tài)特質,使得這種擴展方式缺乏靈活性;并且隨著子 類的增多(擴展功能的增多),各種子類的組合(擴展功能的組合)會導致更多子類的膨脹(多繼承)。繼承為類型引入的靜態(tài)特質的意思是說以繼承的方式使某一 類型要獲得功能是在編譯時。所謂靜態(tài),是指在編譯時;動態(tài),是指在運行時。

GoF《設計模式》中說道:動態(tài)的給一個對象添加一些額外的職責。就增加功能而言,Decorator模式比生成子類更為靈活。

下面來看看Decorator模式的結構:



看這個結構好像不是很明白,下面我根據代碼講解一下這個結構。我想了一個場景:我們現在用的手機功能很多,我就用Decorator模式實現一下對某個手機的GSP和藍牙功能擴展。

首先,我們需要一個手機的接口或者是抽象類,我這里就用抽象類來實現,代碼如下:

public abstract class AbstractCellPhone

    {

        public abstract string CallNumber();

        public abstract string SendMessage();

}

AbstractCellPhone也就是結構圖中的Component,然后,我再來實現NokiaMoto的手機類,這類要繼承AbstractCellPhone,也就是圖中ConcreteComponent類要繼承Component,實現代碼如下:

public class NokiaPhone : AbstractCellPhone

    {

        public override string CallNumber()

        {

            return "NokiaPhone call sombody";

        }

 

        public override string SendMessage()

        {

            return "NokiaPhone send a message to somebody";

        }

    }

 

    public class MotoPhone : AbstractCellPhone

    {

        public override string CallNumber()

        {

            return "MotoPhone call sombody";

        }

 

        public override string SendMessage()

        {

            return "MotoPhone send a message to somebody";

        }

 }   

接下來我需要一個Decorator接口或者抽象類,實現代碼如下:

public abstract class Decorator:AbstractCellPhone

    {

        AbstractCellPhone _phone;

 

        public Decorator(AbstractCellPhone phone)

        {

            _phone = phone;

        }

 

        public override string CallNumber()

        {

            return _phone.CallNumber();

        }

 

        public override string SendMessage()

        {

            return _phone.SendMessage();

        }

  }

正如結構圖中,這個Decorator即繼承了AbstractCellPhone,又包含了一個私有的AbstractCellPhone的對象。這樣做的意義是:Decorator類又使用了另外一個Component類。我們可以使用一個或多個Decorator對象來“裝飾”一個Component對象,且裝飾后的對象仍然是一個Component對象。在下來,我要實現GSP和藍牙的功能擴展,它們要繼承自Decorator,代碼如下:

public class DecoratorGPS : Decorator

    {

        public DecoratorGPS(AbstractCellPhone phone)

            : base(phone)

        { }

 

        public override string CallNumber()

        {

            return base.CallNumber() + " with GPS";

        }

 

        public override string SendMessage()

        {

            return base.SendMessage() + " with GPS";

        }

    }

 

    public class DecoratorBlueTooth : Decorator

    {

        public DecoratorBlueTooth(AbstractCellPhone phone)

            : base(phone)

        { }

 

        public override string CallNumber()

        {

            return base.CallNumber() + " with BlueTooth";

        }

 

        public override string SendMessage()

        {

            return base.SendMessage() + " with BlueTooth";

        }

 }

最后,用客戶端程序驗證一下:

static void Main(string[] args)

        {

             AbstractCellPhone phone = new NokiaPhone();

            Console.WriteLine(phone.CallNumber());

            Console.WriteLine(phone.SendMessage());

            DecoratorGPS gps = new DecoratorGPS(phone);     //add GSP

            Console.WriteLine(gps.CallNumber());

            Console.WriteLine(gps.SendMessage());

            DecoratorBlueTooth bluetooth = new DecoratorBlueTooth(gps); //add GSP and bluetooth

            Console.WriteLine(bluetooth.CallNumber());

            Console.WriteLine(bluetooth.SendMessage());

            Console.Read();

     }

執(zhí)行結果:

NokiaPhone call sombody

NokiaPhone send a message to somebody

NokiaPhone call sombody with GPS

NokiaPhone send a message to somebody with GPS

NokiaPhone call sombody with GPS with BlueTooth

NokiaPhone send a message to somebody with GPS with BlueTooth

 

從執(zhí)行的結果不難看出擴展功能已被添加。最后再說說Decorator裝飾模式的幾點要點:

1、通過采用組合、而非繼承的手法,Decorator模式實現了在運行時動態(tài)的擴展對象功能的能力,而且可以根據需要擴展多個功能。避免了單獨使用繼承帶來的“靈活性差”和“多子類衍生問題”。

2Component類在Decorator模式中充當抽象接口的角色,不應該去實現具體的行為。而且Decorator類對于Component類應該透明——換言之Component類無需知道Decorator類,Decorator類是從外部來擴展Component類的功能。

3、Decorator類在接口上表現為is-a Component的繼承關系,即Decorator類繼承了Component類所具有的接口。但在實現上又表現為has-a Component的組合關系,即Decorator類又使用了另外一個Component類。我們可以使用一個或多個Decorator對象來“裝飾”一個Component對象,且裝飾后的對象仍然是一個Component對象。(在這里我想談一下我的理解:當我們實例化一個Component對象后,要給這個對象擴展功能,這時我們把這個Component對象當作參數傳給Decorator的子類的構造函數——也就是擴展方法的功能類。對于引用類型傳參時,實際上只是傳遞對象的地址,這樣,在功能擴展是,操作的應該是同一個對象)

4Decorator模式并非解決“多子類衍生的多繼承”問題,Decorator模式應用的要點在于解決“主體類在多個方向上的擴展功能”——是為“裝飾”的含義。Decorator是在運行時對功能進行組合。

posted on 2006-06-26 14:43 KiddLee 閱讀(1499) 評論(2)  編輯 收藏 引用 網摘 所屬分類: 設計模式

FeedBack:
# 
Decorator模式的核心就是在不改變接口的前提下擴展功能,呵呵:-)  回復  更多評論
  
# re: 設計模式學習筆記(十)——Decorator裝飾模式 2006-06-26 15:58 idior

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多