Decorator Pattern (裝飾模式)
裝飾模式可「動態」地給一個對象添加一些額外的職責,提供有別于「繼承」的另一種選擇。就擴展功能而言,Decorator Pattern 透過 Aggregation (聚合) 的特殊應用,降低了類與類之間的耦合度,會比單獨使用「繼承」生成子類更為靈活。
一般用「繼承」來設計子類的做法,會讓程序變得較僵硬,其對象的行為,是在「編譯」時期就已經「靜態」決定的,而且所有的子類,都會繼承到相同的行為;然而,若用「裝飾模式」以及 UML 的 Aggregation 的設計,來擴展對象的行為,就能彈性地 (flexible) 將多個「裝飾者」混合著搭配使用,而且是在「執行」時期「動態」地進行擴展。
此外,若用一般「繼承」的做法,每當對象需要新行為時,必須修改既有的代碼、重新編譯;但若透過「裝飾模式」,則無須修改既有代碼。
The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
- Design Patterns: Elements of Reusable Object-Oriented Software

圖 1 此圖為 Decorator 模式的經典 Class Diagram

01_Shell / Program.cs
using System;
namespace _01_Shell
{
//客戶端程序
class Program
{
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
//讓 ConcreteDecorator 在運行時,動態地給 ConcreteComponent 增加職責
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
Console.Read();
}
}
//裝飾者、被裝飾者的共同基類
abstract class Component
{
public abstract void Operation();
}
//被裝飾者。具體被裝飾對象。
//此為在「執行」時期,會被 ConcreteDecorator 具體裝飾者,「動態」添加新行為(職責)的對象
class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具體被裝飾對象的操作");
}
}
//裝飾者。
//此為所有裝飾者,應共同實現的抽象類或接口
abstract class Decorator : Component
{
//以父類聲明的字段。
//實現 UML Class Diagram 的 Aggregation,指向 Component 對象的指針。
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
component.Operation();
}
}
}
//具體裝飾者 A
//此為在「執行」時期,替 ConcreteComponent「動態」添加新行為(職責)的對象
class ConcreteDecoratorA : Decorator
{
//裝飾者可以添加新的欄位
private string addedState;
public override void Operation()
{
base.Operation();
addedState = "New State";
Console.WriteLine("具體裝飾對象 A 的操作");
}
}
//具體裝飾者 B
//此為在「執行」時期,替 ConcreteComponent「動態」添加新行為(職責)的對象
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("具體裝飾對象 B 的操作");
}
//裝飾者可以添加新的方法
private void AddedBehavior()
{
}
}
} // end of namespace
/*
執行結果:
具體被裝飾對象的操作
具體裝飾對象 A 的操作
具體裝飾對象 B 的操作
*/
NET技術:C# Design Patterns (3) - Decorator,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。