详细见:https://www.runoob.com/design-pattern/decorator-pattern.html

什么是装饰器模式??

  • 装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。
  • 说人话:我原本的类不想改,但是我还想添加额外的功能
  • 实现思想:套娃

主要解决了什么问题?

  • 避免通过继承引入静态特征,特别是在子类数量急剧膨胀的情况下。
  • 允许在运行时动态地添加或修改对象的功能。

:::color4
使用建议:

  • 在需要动态扩展功能时,考虑使用装饰器模式。
  • 保持装饰者和具体组件的接口一致,以确保灵活性。

:::

具体实现

具体思路

下面以简单的附魔系统演示代码

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IWeapon 
{
void Attack();
}

public class Sword : IWeapon
{
public void Attack()
{
Debug.Log("挥剑攻击!");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 装饰器基类(模板)
/// </summary>
public abstract class WeaponDecorator : IWeapon
{
protected IWeapon weapon;
public WeaponDecorator(IWeapon weapon)
{
this.weapon = weapon;
}
public virtual void Attack()
{
weapon.Attack();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FireEnchantment : WeaponDecorator
{
public FireEnchantment(IWeapon weapon) : base(weapon)
{
}
public override void Attack()
{
base.Attack();
Debug.Log("附加火焰效果!");
}
}

// 具体装饰器:冰冻附魔
public class IceEnchantment : WeaponDecorator
{
public IceEnchantment(IWeapon weapon) : base(weapon) { }
public override void Attack()
{
base.Attack();
Debug.Log("附加冰冻效果!");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
private void Start()
{
IWeapon weapon = new Sword();
IWeapon fireSword = new FireEnchantment(weapon);
IWeapon iceAndFireSword = new IceEnchantment(fireSword);
iceAndFireSword.Attack();
//火焰剑包裹普通剑
//冰剑包裹火剑
//最后冰剑里面直接调用的火剑攻击
//火剑里面调用正常挥砍
//最后往上套娃
//输出为:挥砍,火焰,冰冻
}
执行顺序 执行的方法 输出内容 说明
1 IceEnchantment.Attack() → base.Attack() - 进入最外层装饰器,先调用被包装对象
2 FireEnchantment.Attack() → base.Attack() - 进入第一层装饰器,先调用被包装对象
3 Sword.Attack() 挥剑攻击! 执行核心对象功能,输出第一行
4 FireEnchantment.Attack () 后续代码 附加火焰效果! 回溯执行第一层装饰器额外功能,输出第二行
5 IceEnchantment.Attack () 后续代码 附加冰冻效果! 回溯执行最外层装饰器额外功能,输出第三行