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

C# 設計模式無廢話系列(十三):Decorator 裝飾模式

     編輯:關於C#

意圖

動態給對象添加額外職責。就增加功能而言,Decorator 比生成子類更靈活。

適用場景

網遊武器系統:初期未考慮強化與磨損。策劃後續要求強化、修理系統。武器類需對外提供強化、磨損、修理方法。若用繼承:

  • 部分武器可磨損修理不可強化
  • 部分可強化不磨損
  • 部分兩者皆可

繼承層次與子類數量爆炸。引入 Decorator 靈活賦予額外職責。

完整範例程式碼

using System;
using System.Collections.Generic;
using System.Text;

namespace DecoratorExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Weapon w = new Rifle();
            w.ShowInfo();
            Enhance enhancedWeapon = new Enhance(w);
            enhancedWeapon.EnhanceAmmo();
            enhancedWeapon.ShowInfo();
            Wear wornWeapon = new Wear(w);
            wornWeapon.WearByRate(0.8);
            wornWeapon.ShowInfo();
        }
    }
    abstract class Weapon
    {
        public double Ammo { get; set; }
        public double Attack { get; set; }
        public double Speed { get; set; }
        public string Name { get; set; }
        public abstract void ShowInfo();
    }
    class Rifle : Weapon
    {
        public Rifle() { Ammo = 100; Attack = 10; Speed = 5; Name = "Rifle"; }
        public override void ShowInfo()
        {
            Console.WriteLine($"ammo\t{Ammo}");
            Console.WriteLine($"attack\t{Attack}");
            Console.WriteLine($"speed\t{Speed}");
            Console.WriteLine($"name\t{Name}");
        }
    }
    abstract class Decorator : Weapon
    {
        protected Weapon w;
        public Decorator(Weapon w) { this.w = w; }
        public override void ShowInfo() => w.ShowInfo();
    }
    class Enhance : Decorator
    {
        public Enhance(Weapon w) : base(w) { }
        public void EnhanceAmmo() { w.Ammo += 20; Console.WriteLine(">>>>>>>>Enhanced"); }
    }
    class Wear : Decorator
    {
        public Wear(Weapon w) : base(w) { }
        public void WearByRate(double rate) { w.Speed *= rate; w.Attack *= rate; Console.WriteLine(">>>>>>>>Worn"); }
    }
}

程式碼執行結果

Decorator 模式執行結果

程式碼解析

  • Weapon:抽象構件。
  • Rifle:具體構件。
  • Decorator:裝飾角色,兩大特徵:繼承抽象構件、持有構件實例。
  • Enhance/Wear:具體裝飾,附加職責。
  • 客戶端使用具體裝飾的額外方法(EnhanceAmmo/WearByRate),屬半透明裝飾(非針對抽象構件編程)。

何時採用

  • 代碼角度:功能交叉擴展不會導致過多子類或繼承層次。
  • 應用角度:希望動態賦予/撤銷職責,並任意排列組合。

實作要點

  • 裝飾角色繼承抽象構件、持有構件實例——核心特徵。
  • 持有構件實例使一構件可被多裝飾對象裝飾。
  • 實務可靈活處理:不一定要有抽象構件與裝飾角色,但「繼承構件+持有實例」兩特徵須體現。
  • 透明裝飾:基類方法前後擴充;半透明裝飾:新介面實現。

注意事項

  • Decorator vs Bridge:前者針對功能擴展(本質同一東西),後者針對多維度變化。Decorator 思想在擴展介面,Bridge 在分離介面。
  • 裝飾類可能瑣碎、不利復用,增加靈活性的同時降低封裝度,實務常與其他模式配合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved