定义

动态地给一个对象动态添加额外的职责

使用场景

存在多种相同功能的职责,只是有细微不同,为对象搭配职责:

  • 比如人物衣着搭配的多样性
  • 比如搭配不同种类的咖啡
  • 比如MOBA游戏的加点方式
  • 比如吃鸡类游戏的枪械拼接方案

代码实现

// 规定职责的接口
abstract class Component
{
    public abstract void Operation();
}

// 具体被装饰的对象
class ConcreteComponent : Component
{
    public override void Operation()
   {
         //具体实现
    }
}

// 装饰抽象类
abstract class Decorator: Component
{
     protected Component component;
     


public void SetComponent(Component component)
{
    this.component = component;
}

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


}

//装饰实现类A
class ConcreteDecoratorA: Decorator
{
    private void Method(){}
     

    public override void Operation()
    {
          base.Operation();
          Method();
    }


}

//装饰实现类B
class ConcreteDecoratorB: Decorator
{
       //同 ConcreteDecoratorA
}


void Main()
{
   ConcreteComponent C = new ConcreteComponent();
   ConcreteDecoratorA a = new ConcreteDecoratorA();
   ConcreteDecoratorB b = new ConcreteDecoratorB();

    a.SetComponent(c);
    b.SetComponent(a);
    b.Operation();
}

好处

  1. 主要解决了“过度使用继承来扩展对象的功能”,过度继承会导致子类膨胀,且在子类不使用父类功能的情况下,不应该使用继承的方式
  2. 把类的装饰功能从类中搬移出来,简化了原来的类
  3. 把类的核心功能 和 装饰功能 区分开,而且也简化了重复的装饰逻辑

坏处

  1. 会产生很多的小对象,增加了系统的复杂性
  2. 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐