Decorator Pattern (裝飾模式)
裝飾模式可「動(dòng)態(tài)」地給一個(gè)對(duì)象添加一些額外的職責(zé),提供有別于「繼承」的另一種選擇。就擴(kuò)展功能而言,Decorator Pattern 透過(guò) Aggregation (聚合) 的特殊應(yīng)用,降低了類(lèi)與類(lèi)之間的耦合度,會(huì)比單獨(dú)使用「繼承」生成子類(lèi)更為靈活。
一般用「繼承」來(lái)設(shè)計(jì)子類(lèi)的做法,會(huì)讓程序變得較僵硬,其對(duì)象的行為,是在「編譯」時(shí)期就已經(jīng)「靜態(tài)」決定的,而且所有的子類(lèi),都會(huì)繼承到相同的行為;然而,若用「裝飾模式」以及 UML 的 Aggregation 的設(shè)計(jì),來(lái)擴(kuò)展對(duì)象的行為,就能彈性地 (flexible) 將多個(gè)「裝飾者」混合著搭配使用,而且是在「執(zhí)行」時(shí)期「動(dòng)態(tài)」地進(jìn)行擴(kuò)展。
此外,若用一般「繼承」的做法,每當(dāng)對(duì)象需要新行為時(shí),必須修改既有的代碼、重新編譯;但若透過(guò)「裝飾模式」,則無(wú)須修改既有代碼。
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 模式的經(jīng)典 Class Diagram

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