1. 程式人生 > >C#設計模式之:裝飾模式

C#設計模式之:裝飾模式

裝飾模式(Decorator):
動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生在子類更為靈活

UML類圖

這裡寫圖片描述

Component 是定義一個物件介面,可以給這些物件動態地新增職責
ConcreteComponent是定義一個具體物件,也可以給這個物件新增一些職責
Decorator,裝飾抽象類,繼承了Component,從外類來擴充套件Component類的功能,但對於Component來說,是無需知道Decorator存在的.
ConcreteDecorator是具體的裝飾物件,起到給一個物件裝飾A裝飾B新增職責的功能

// Component.cs
abstract class Component { public abstract void Operation(); }
// ConcreteComponent.cs
class ConcreteComponent : Component
{
    public override void Operation()
    {
        Console.WriteLine("一個物件");
    }
}
// Decorator.cs
abstract class Decorator : Component
{
    protected Component component;

    public
void SetComponent(Component component) { this.component = component; } public override void Operation() { if (component != null) { component.Operation(); } } }
// ConcreteDecoratorA.cs
class ConcreteDecoratorA : Decorator
{
    public
override void Operation() { base.Operation(); Console.WriteLine("裝飾A"); } }
// ConcreteDecoratorB.cs 
class ConcreteDecoratorB : Decorator
{
    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("裝飾B");
    }
}
// test
Component c = new ConcreteComponent();
ConcreteDecoratorA a = new ConcreteDecoratorA();
ConcreteDecoratorB b = new ConcreteDecoratorB();

a.SetComponent(c);
b.SetComponent(a);

b.Operation();
// 輸出
一個物件
裝飾A
裝飾B

總結
裝飾模式是為已有功能動態地新增更多功能的一種方式
何時使用?
當系統需要新增新功能時,向舊類中新增新的程式碼,這些新加的程式碼通常裝飾了原有類的核心職責或主要行為
問題在於:新加入的變數,方法或邏輯增加了主類的複雜度,但新加的這些東西可能只在某些特定情況下才會執行的特殊行為
裝飾者把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的物件,當需要執行特殊行為時,客戶就可以在執行時根據需要有選擇地、按順序地使用裝飾功能包括物件了

優點
把類中的裝飾功能從類中搬移分離出去,可以簡化原有的類,有效的把類的核心職責和裝飾功能區分開,並且可以去除相關類中重複的裝飾邏輯,但如果裝飾順序很重要,就要注意了

相關推薦

C#設計模式裝飾模式

裝飾模式(Decorator): 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生在子類更為靈活 UML類圖 Component 是定義一個物件介面,可以給這些

c# 設計模式 裝飾模式

如果 透明 組件 通過 繼續 color [] 接收 lin 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手機添加貼膜,手機掛件,手機外殼等,如果此時利用繼承來實現的話,就需要定義無數的類,如StickerPhone(貼膜是手機類)、Accesso

設計模式裝飾模式

裝飾模式用於動態的往元件(Component)上新增功能。主要使用的場所為: 需要擴充套件一個類的功能,或給一個類增加附加責任。 需要動態的給一個物件增加功能,這些功能可以再動態地撤銷。 需要增

php設計模式裝飾模式

decorator tac coff cti cor ring 咖啡 parent namespace Beverage.php <?php namespace DesignPattern; abstract class Beverage { /**

C#設計模式備忘錄模式

備忘錄模式(Memento) 在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態 UML 程式碼 class Mem

C#設計模式命令模式

命令模式Command 將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷操作。 UML 程式碼 abstract class Command

c# 設計模式 工廠模式---工廠模式

gas exec load common pre bubuko 技術分享 ron deb 1、uml類圖: 實現和依賴關系: 實現:   SportFactory、JeepFactory、HatchbackFactory 實現 IFactory 接口   SportCa

設計模式模式PK裝飾模式VS適配器模式

角度 朋友 hit 擴展 override 轉換 展現 調用 代理 1、概述 裝飾模式和適配器模式在通用類圖上沒有太多的相似點,差別比較大,但是它們的功能有相似的地方:都是包裝作用,都是通過委托方式實現其功能。不同點是:裝飾模式包裝的是自己的兄弟類,隸屬於同一個家族(相同接

Java設計模式20 —— 裝飾模式(1)

裝飾模式是一種結構型設計模式。其使用一種對客戶端透明的方式,來動態的擴充套件物件的功能。同時,它也是繼承關係的一種替代方案之一。定義:動態地給一個物件新增一些額外的職責。就增加個來說,裝飾模式比生成子類更為靈活。 所以,我們可以在需要透明而且動態地擴充套件類的功能時,所以裝

Java設計模式20 —— 裝飾模式(2)

裝飾模式是一種結構型設計模式。其使用一種對客戶端透明的方式,來動態的擴充套件物件的功能。同時,它也是繼承關係的一種替代方案之一。定義:動態地給一個物件新增一些額外的職責。就增加個來說,裝飾模式比生成子類更為靈活。 所以,我們可以在需要透明而且動態地擴充套件類的功能時,所以裝

設計模式工廠模式(factory)

工廠模式factory 工廠模式其主旨在於將物件的建立過程抽取(抽象)出來,形成專門用於統一建立物件的類; 根據不同的建立要求,建立所需要的物件; C++實現 #include<i

大話設計模式原型模式

一.模式定義 原型模式是物件建立型模式。 Prototype Pattern: Specify the kind of objects to create using a prototypical instance, and create new objects by c

Java23種設計模式策略模式和工廠模式

因為目前產品用到了策略模式,比如國內的使用者註冊走A流程,美國使用者走B流程,印度使用者走C流程,每個流程有些相同,有些則完全不一樣。 這兩種設計模式非常容易弄混淆。   策略模式和工廠模式: 1. 關注點不一樣,工廠模式關注物件建立,策略模式關注行為封裝 2.解決的問題不

設計模式工廠模式

目錄 一. 簡單工廠模式 本質 優點 缺點 程式碼示例: 二.抽象工廠模式 本質 優點 缺點 程式碼示例 參考連線: 工廠設計模式的實現是一個不屬於任何類的單一函式,負責單一種類物件的建立。 一. 簡單工廠模式 本質 給一個函式傳遞不同

設計模式代理模式

前言 代理模式的本質就是隱藏真實角色資訊,實現間接接觸。比如我們平常在租房時會找中介,中介就相當於一個代理,房東和租戶直接聯絡的都是中介。 代理模式有3個必要的元素: 真實的物件(執行業務邏輯,被代理的物件) 代理類(使用者請求的一個介面,對真實目標的保護) 使用者(獲

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

【1】基本概念           裝飾模式(Decorator),動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 【2】簡單分析           我們先來看下該設計模式的UML結構圖 上圖是Decorator 模式的結構圖,讓我們可

java常用設計模式裝飾模式

一、概念  裝飾模式可以在不改變一個物件本身功能的基礎上給物件增加額外的新行為。 基本角色: 抽象構件:它是具體構件和抽象裝飾類的共同父類,聲明瞭在具體構件中實現的業務方法,它的引入可以使客戶端以一致的方式處理未被裝飾的物件以及裝飾之後的物件,實現客戶端的透明操作。 具體構件:它是抽

Java描述設計模式(09)裝飾模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 孫悟空有七十二般變化,他的每一種變化都

C#設計模式結構類模式裝飾模式

負責 gzip null pattern 產生 設計師 san 抽象 接口 定義(Decorator Pattern): 動態的給一個對象添加一些額外的職責。就添加功能來說,它相比生成子類更為靈活。 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手

C#設計模式行為類模式模板方法模式

frame 應該 ocp 方式 src 代碼復用 操作 優缺點 sse 定義(Template Method) 定義一個操作中算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 啟示 組裝電腦一般包含三個部分,主機、顯示