定義: 動態地給一個物件新增額外職責。裝飾者模式提供比繼承更彈性的替代方案,能在執行時期靈活擴充物件功能。
優點:
當現有物件開發完成,後期因業務需求需大量擴充功能時,不應使用子類別靜態繼承,而應採用裝飾者模式動態附加新狀態或行為。
生活化比喻: 購買一輛基本款汽車,後期想要改裝外觀、提升引擎馬力。若用繼承需為每種組合建立子類(如「加裝尾翼的車」、「加裝渦輪的車」、「加裝尾翼與渦輪的車」...),類別數量爆炸。裝飾者模式則允許在執行時動態組合「尾翼裝飾」、「渦輪裝飾」,彈性極高。



public abstract class Component
{
public abstract void Operation();
}
public class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("開始執行具體的對象...");
}
}
public abstract class Decorator : Component
{
private Component _component;
public void SetComponent(Component component)
{
_component = component;
}
public override void Operation()
{
if (_component != null)
{
_component.Operation();
}
}
}
public class ConcreteDecoratorA : Decorator
{
private string _addedState;
public override void Operation()
{
base.Operation();
_addedState = "進行了狀態屬性裝飾。";
Console.WriteLine(_addedState);
}
}
public class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
}
private void AddedBehavior()
{
Console.WriteLine("進行了操作行為裝飾。");
}
}
static void Main(string[] args)
{
ConcreteComponent cc = new ConcreteComponent();
ConcreteDecoratorA cda = new ConcreteDecoratorA();
ConcreteDecoratorB cdb = new ConcreteDecoratorB();
cda.SetComponent(cc); // 第一層裝飾:加上狀態
cdb.SetComponent(cda); // 第二層裝飾:加上行為
cdb.Operation(); // 觸發完整鏈路
Console.Read();
}


此案例展示如何對具體元件 TextView 進行 Border 與 ScrollBar 裝飾,使其符合專案需求,完美詮釋「動態組合優於靜態繼承」的設計哲學。
裝飾者模式讓我們能在執行期間動態決定物件的功能組合,提供「即插即用」的擴充方式。相較於生成大量子類別,裝飾者模式在新增功能上極具彈性,是處理橫切關注點與選擇性功能疊加的經典選擇。