首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 設計模式實戰:裝飾者模式完整解析與程式碼範例

     編輯:關於.NET

一、裝飾者模式簡介

定義: 動態地給一個物件新增額外職責。裝飾者模式提供比繼承更彈性的替代方案,能在執行時期靈活擴充物件功能。

優點:

  • 將裝飾功能從核心類別中分離,簡化原始類別設計。
  • 有效區分核心職責與裝飾職責,符合單一職責原則。
  • 支援「即插即用」:執行期間決定何時加入何種功能,比靜態繼承更靈活。

二、解決的問題

當現有物件開發完成,後期因業務需求需大量擴充功能時,不應使用子類別靜態繼承,而應採用裝飾者模式動態附加新狀態或行為。

生活化比喻: 購買一輛基本款汽車,後期想要改裝外觀、提升引擎馬力。若用繼承需為每種組合建立子類(如「加裝尾翼的車」、「加裝渦輪的車」、「加裝尾翼與渦輪的車」...),類別數量爆炸。裝飾者模式則允許在執行時動態組合「尾翼裝飾」、「渦輪裝飾」,彈性極高。

基本款汽車

改裝後的個性化汽車

三、裝飾者模式結構分析

裝飾者模式 UML 結構圖

核心角色

  • Component (元件介面):定義物件介面,可動態新增職責。
  • ConcreteComponent (具體元件):實作 Component 介面的具體物件,也是被裝飾的目標。
  • Decorator (抽象裝飾類別):繼承 Component,內部持有 Component 參考,作為所有具體裝飾者的基類。
  • ConcreteDecoratorA / ConcreteDecoratorB (具體裝飾類別):實際執行裝飾邏輯,分別新增狀態屬性或操作行為。

四、完整程式碼實作 (C#)

1. 元件介面

public abstract class Component
{
    public abstract void Operation();
}

2. 具體元件

public class ConcreteComponent : Component
{
    public override void Operation()
    {
        Console.WriteLine("開始執行具體的對象...");
    }
}

3. 抽象裝飾類別

public abstract class Decorator : Component
{
    private Component _component;

    public void SetComponent(Component component)
    {
        _component = component;
    }

    public override void Operation()
    {
        if (_component != null)
        {
            _component.Operation();
        }
    }
}

4. 具體裝飾類別 A:新增狀態屬性

public class ConcreteDecoratorA : Decorator
{
    private string _addedState;

    public override void Operation()
    {
        base.Operation();
        _addedState = "進行了狀態屬性裝飾。";
        Console.WriteLine(_addedState);
    }
}

5. 具體裝飾類別 B:新增操作行為

public class ConcreteDecoratorB : Decorator
{
    public override void Operation()
    {
        base.Operation();
        AddedBehavior();
    }

    private void AddedBehavior()
    {
        Console.WriteLine("進行了操作行為裝飾。");
    }
}

6. 用戶端程式碼

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();
}

7. 程式執行結果

程式執行結果輸出

五、實務案例:TextView 與 Border、ScrollBar 裝飾

TextView 裝飾案例示意圖

此案例展示如何對具體元件 TextView 進行 Border 與 ScrollBar 裝飾,使其符合專案需求,完美詮釋「動態組合優於靜態繼承」的設計哲學。

六、總結

裝飾者模式讓我們能在執行期間動態決定物件的功能組合,提供「即插即用」的擴充方式。相較於生成大量子類別,裝飾者模式在新增功能上極具彈性,是處理橫切關注點與選擇性功能疊加的經典選擇。

出處:https://www.cnblogs.com/ywqu

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved