1. 程式人生 > >【C#設計模式-裝飾者模式】

【C#設計模式-裝飾者模式】

一.裝飾者模式的定義:

裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。

結構:


(1)抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。
(2)具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。
(3)裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。
(4)具體裝飾(Concrete Decorator)角色:負責給構件物件新增上附加的責任。             

二.裝飾者模式的實現:

這裡應用顯示生活中的例子,我們買了一部新手機,慢慢的給這部手機新增新的裝飾,比如說貼膜,添加掛件.....

首先抽象出手機類,作為裝飾者模式中的抽象元件:

    /// <summary>
    /// 手機抽象類,即抽象者模式中的抽象元件類
    /// </summary>
    public abstract class Phone
    {
        /// <summary>
        /// 列印方法
        /// </summary>
        public abstract void Print();
    }
假如現在我們買了一部蘋果手機,現在繼承自抽象類,實現具體元件類。
    /// <summary>
    /// 蘋果手機,即裝飾著模式中的具體元件類
    /// </summary>
    public class ApplePhone:Phone
    {
        /// <summary>
        /// 重寫基類的方法
        /// </summary>
        public override void Print()
        {
            Console.WriteLine("我有一部蘋果手機");
        }
    }
現在我想給這個手機新增新的裝飾:我們先抽象出裝飾類:
    /// <summary>
    /// 裝飾抽象類,讓裝飾完全取代抽象元件,所以必須繼承Phone
    /// </summary>
    public abstract class Decorator:Phone
    {
        private Phone p ;    //該裝飾物件裝飾到的Phone元件實體物件
        
        public Decorator(Phone p)
        {
            this.p = p;
        }

        public override void Print()
        {
            if (this.p != null)
            {
                p.Print();
            }
        }
    }
具體裝飾物件,繼承裝飾抽象類:這裡具體貼膜裝飾,和掛件裝飾:
    /// <summary>
    /// 貼膜,具體裝飾者
    /// </summary>
    public class Sticker:Decorator
    {
        public Sticker(Phone p) : base(p) { }

        public override void Print()
        {
            base.Print();
            //新增行為
            AddSticker();
        }

        /// <summary>
        /// 新的行為方法
        /// </summary>
        public void AddSticker()
        {
            Console.WriteLine("現在蘋果手機有貼膜了");
        }
    }
    /// <summary>
    /// 手機掛件,即具體裝飾者
    /// </summary>
    public class Accessories:Decorator
    {
        public Accessories(Phone p) : base(p) { }

        public override void Print()
        {
            base.Print();

            // 新增新的行為
            AddAccessories();
        }

        /// <summary>
        /// 新的行為方法
        /// </summary>
        public void AddAccessories()
        {
            Console.WriteLine("現在蘋果手機有漂亮的掛件了");
        }
    }
使用如下:
    /// <summary>
    /// 設計模式-裝飾者模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Phone ap = new ApplePhone(); //新買了個蘋果手機
            Decorator aps = new Sticker(ap); //準備貼膜元件
            aps.Print();

            Decorator apa = new Accessories(ap); //過了幾天新增了掛件元件
            apa.Print();

            Sticker s = new Sticker(ap);       //準備貼膜元件
            Accessories a = new Accessories(s);//同時準備掛件
            a.Print(); 
        }
    }
類圖關係如下:

        (1)抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。>這裡就是Phone介面
  (2)具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。                   >這裡指的ApplePhone
  (3)裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並實現一個與抽象構件介面一致的介面。>指的Decorator
  (4)具體裝飾(Concrete Decorator)角色:負責給構件物件新增上附加的責任。                   >指的是Accessories和Sticker

優點:

1. Decorator模式與繼承關係的目的都是要擴充套件物件的功能,但是Decorator可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

缺點:

1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。 2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。 3. 裝飾模式是針對抽象元件(Component)型別程式設計。但是,如果你要針對具體元件程式設計時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component介面,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際專案中要做出最佳選擇。

相關推薦

C#設計模式-裝飾模式

一.裝飾者模式的定義: 裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 結構: (1)抽象構件(Component)角色:給出一個抽象介面,以規範準備接收附加責任的物件。 (2)具體構件

Java設計模式--裝飾模式Decorator Pattern

      有時,你想要在程式執行期間為某個物件組合新的行為,且在某種情況下,你需要物件的行為發生一些細小的變化,並且這些變化可以自由組合。這時,裝飾者模式就可以滿足這種需求。  所謂裝飾者模式,也叫修飾者模式、裝飾器模式,意圖是在執行時組合操作的新變化,即動態地給一個物件

C# - 設計模式 - 裝飾模式

private 實現類 comm 回路 匯總 abs round C# 由於 裝飾者模式 問題場景 如果要計算一杯咖啡的價格,只需要調用其獲取價格的方法就可以了,但是如果需要加一些材料,比如牛奶、巧克力、糖等等,這些材料也必須返回它們價格以便於用於匯總計算,但是材料有很

C#設計模式——裝飾模式

方式 實例 oid spa als note 客戶 基本功 pan 一、裝飾者模式介紹: 裝飾者模式——以對客戶透明的方式動態地給一個對象添加額外的職責,采用對象組合而非繼承的方式實現了再運行時動態地擴展對象功能的能力,相比生成子類可以更靈活地增加功能,而且可以根據需要擴展

C++設計模式--裝飾模式

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。                                                                                          

C#設計模式-裝飾模式

using System; using System.Collections.Generic; namespace TestCS { class Program { static void Main(string[] args) {

(34)C#設計模式——裝飾模式(Decorator Pattern)

引言 在軟體開發中,我們經常想要對一類物件新增不同的功能,例如要給手機新增貼膜、掛件、外殼等。如果此時使用繼承來實現的話,我們就需要定義無數的類,這樣會導致“子類爆炸”的問題。為了解決這個問題,可以使用裝飾者模式來動態地給一個物件新增額外的職責。 裝飾者模式的詳細介紹

最常用的設計模式---裝飾模式C++實現)

      上一篇說了介面卡模式,這一篇接著學習裝飾者模式。     想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。      裝飾者模式主要實現的功能是動態的給某一個類新增一些額外的功能,它是一個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選

Java設計模式裝飾模式

解決 over 裝飾者模式 pack img 應該 ora 我們 lan 目錄      一、問題引入  二、設計原則  三、用裝飾者模式解決問題  四、裝飾者模式的特點  五、裝飾者模式的定義  六、裝飾者模式的實現  七、java.io包內的裝飾者模式

javascript設計模式——裝飾模式

應用 提交表單 不同 ora fin input 是否為空 插件 和數 前面的話   在程序開發中,許多時候都並不希望某個類天生就非常龐大,一次性包含許多職責。那麽可以使用裝飾者模式。裝飾者模式可以動態地給某個對象添加一些額外的職責,而不會影響從這個類中派生的其他對象。本

設計模式——裝飾模式

什麽 很多 方法 info 改變 劃分 llb 設計 nts - 什麽是裝飾者模型 裝飾者模型通過組合的方式擴展對象的特性,動態地給對象添加額外的職責。在增加功能上,裝飾模式比生成子類更加靈活。 - 職責劃分 Component抽象構建,是接口或者抽象類,就是定義原始對象

設計模式-裝飾模式(Go語言描述)

什麼是裝飾者模式 好久沒有更新設計模式系列的部落格了, 今天我們來聊一聊裝飾者模式, 用過java的同學肯定對裝飾者模式非常熟悉,就算你不知道什麼是裝飾者模式這概念, 你也一定在程式碼中經常用到這個模式,為什麼這麼說呢? 大家都用過java中的流吧, 我們可以這樣寫: new B

android設計模式——裝飾模式

定義:允許向一個現有的物件新增新的功能,同時又不改變其結構。 使用場景:能夠動態地擴充套件類的功能 應用舉例:一個畫可以被裝在畫框裡,並且被蒙上玻璃,這時候畫,玻璃,畫框組成了一個東西。 類圖: Comppoent: 抽象元件 ConcreteComponet:元件的具體

java設計模式--裝飾模式

照例搬一篇文章連線,我一般會選擇帶有uml圖的 方便理解,我只貼程式碼,因為我覺得別人理解的比我透徹,寫的比我好 http://www.cnblogs.com/stonefeng/p/5679638.html 裝飾者模式可以給物件新增一些額外的東西,設計模式那種書中舉例是星巴克的例子,如果每一種做

設計模式-裝飾模式(Decorator)

概述 定義 : 在不改變原有物件的基礎之上, 將功能附加到物件上 提供了比繼承更有彈性的替代方案(擴充套件原有物件功能) 又叫包裝器Wrapper, 介面卡模式也被稱之為包裝器 型別 : 結構型 適用場景 擴充套件一個類的功能或給一個類

Java設計模式-裝飾模式

定義: 裝飾者是在不改變物件的情況下動態給物件新增屬性和行為,將責任動態的附加在物件上。 與繼承有類似功能即擴充套件功能。 裝飾者模式與繼承的區別: **繼承:**在子類擴充套件功能的時候是靜態的,並且是已知需要擴充套件的功能,是在編譯時實現的。 **裝飾者模式:**比繼承更

從原始碼角度理解Java設計模式——裝飾模式

一、飾器者模式介紹 裝飾者模式定義:在不改變原有物件的基礎上附加功能,相比生成子類更靈活。 適用場景:動態的給一個物件新增或者撤銷功能。 優點:可以不改變原有物件的情況下動態擴充套件功能,可以使擴充套件的多個功能按想要的順序執行,以實現不同效果。 缺點:更多的類,使程式複雜 型別:結構型。 類圖

設計模式--結構型模式--裝飾模式

//Structural Patterns--Decorator //結構型模式--裝飾者模式 //Component(抽象構件):給出一個抽象介面,以規範準備接收附加責任的物件。 //ConcreteComponent(具體構件):定義一個將要接收附加責任的類。 //De

Header First設計模式——裝飾模式

       我曾經以為應該用繼承處理一切。後來領教到執行時擴充套件,遠比編譯時期的繼承威力大。本章可以稱為“給愛用繼承的人一個全新的設計眼界”。我們即將再度探討典型的繼承濫用問題。在本章將會學到如何使用物件組合的方式,做到在執行時裝飾類。一旦你熟悉了裝飾的技巧,你將能在不修

Java設計模式---裝飾模式(用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強)

裝飾者模式可以動態地給一個物件新增一些額外的職責。 就增加功能來說,Decorator模式相比生成子類更為靈活。 該模式的適用環境為: (1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。 (2)處理那些可以撤消的職責。 (3)當不能採用生成子