设计模式 --- 装饰器模式

装饰模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

优点:

1.灵活性高:可以在运行时动态地为对象添加或删除功能,而不需要修改对象的原有代码。

2.可扩展性强:可以通过组合不同的装饰器,为对象添加多种不同的功能,满足不同的需求。

3.符合开闭原则:对扩展开放,对修改关闭。当需要添加新的功能时,只需要创建新的装饰器类,而不需要修改原有的代码。

缺点:

1.产生过多的小对象 :大量小型装饰器类导致类数量膨胀,增加了系统的复杂性和内存开销。

优化:对象池复用。

2.调试困难:多层装饰器的嵌套可能会导致调试困难,因为很难确定每个装饰器的具体作用。

说明例子:

1.UML类图:

2.实现:

1.定义绘制类:

cs 复制代码
   public class DrawEngine
   {
       public void Render(string ObjName)
       {
           Debug.Log("Render:" + ObjName);
       }
   }

2.定义形状类接口以及形状实现:

cs 复制代码
  //形状接口类
  public abstract class ISingleShape
  {
      protected DrawEngine m_engine = null;

      public virtual void SetRenderEngine(DrawEngine renderEngine)
      {
          m_engine = renderEngine;
      }

      public abstract void Draw();
      public abstract string GetPolygon();
  }

  public class SingleSphere : ISingleShape
  {
      public override void Draw()
      {
          m_engine.Render("Draw SingleSphere");
      }

      public override string GetPolygon()
      {
          return "Single Sphere 多边形";
      }
  }

3.定义附加功能接口以及实现类:

cs 复制代码
    //附加功能实现
    public abstract class IAdditional
    {
        protected DrawEngine m_engine = null;

        public void SetRenderEngine(DrawEngine renderEngine)
        {
            m_engine = renderEngine;
        }

        public abstract void DrawOnShape(ISingleShape theShape);
    }

    //外框类
    public class Border : IAdditional
    {
        public override void DrawOnShape(ISingleShape theShape)
        {
            m_engine.Render("Draw Border On" + theShape.GetPolygon());
        }
    }
  1. 定义形状装饰器接口类和实现类:
cs 复制代码
    //形状装饰器接口类
    public abstract class ISingleShapeDecorator : ISingleShape
    {
        ISingleShape m_Component;

        public ISingleShapeDecorator(ISingleShape theComponent)
        {
            m_Component = theComponent;
        }

        public override void Draw()
        {
            m_Component.Draw();
        }

        public override string GetPolygon()
        {
            return m_Component.GetPolygon(); 
        }
    }

    //外框装饰器类
    public class BorderDecorator : ISingleShapeDecorator
    {
        //外框功能
        Border m_Border = null;

        public BorderDecorator(ISingleShape theComponent):base(theComponent) { m_Border = new Border(); }

        public override void SetRenderEngine(DrawEngine renderEngine)
        {
            base.SetRenderEngine(renderEngine);
            m_Border.SetRenderEngine(renderEngine);
        }

        public override void Draw()
        {
            //被装饰者功能
            base.Draw();
            //外框功能
            m_Border.DrawOnShape(this);
        }
    }

5.测试类:

cs 复制代码
  public class DecoratorPattern : MonoBehaviour
  {
      // Start is called before the first frame update
      void Start()
      {
          DrawEngine theDraw = new DrawEngine();

          SingleSphere theSphere = new SingleSphere();
          theSphere.SetRenderEngine(theDraw);

          BorderDecorator theSphereWithBorder = new BorderDecorator(theSphere);
          theSphereWithBorder.SetRenderEngine(theDraw);
          theSphereWithBorder.Draw();
      }
  }

游戏中的使用场景:

1.角色属性加成系统​ :装备/Buff 需要动态叠加属性且支持多种组合。

2.技能效果叠加​ :基础技能需要支持动态添加元素效果(冰冻/燃烧/中毒)。

3.UI 系统增强 ​:需要动态为UI组件添加装饰效果(边框/阴影/动画)。

4.游戏状态叠加​ :角色状态需要支持多种Buff/Debuff叠加(加速/中毒/隐身)​​​​​​​。

5.音效系统增强​ :需要动态调整音效(回声/混响/音量调节)​​​​​​​。

6.成就系统扩展​:基础成就需要支持条件叠加(首次达成/困难模式/无伤通关)。

总结:

通过装饰器模式,可在不修改现有对象结构的情况下,动态添加功能。在游戏开发中,这种模式特别适合实现装备系统、技能修饰、UI增强等需要灵活组合的场景。

参考书籍:

《Hands-On Game Development Patterns with Unity 2019》

《设计模式与游戏完美开发》

相关推荐
玩泥巴的9 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
高晶12 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风13 小时前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
cpp_w13 小时前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet14 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong12314 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
代钦塔拉15 小时前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式
步步为营DotNet15 小时前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
bigbread1 天前
策略模式 + 工厂方法模式在项目中的实战应用
设计模式
用户788477316341 天前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#