定义
动态地给一个对象动态添加额外的职责
使用场景
存在多种相同功能的职责,只是有细微不同,为对象搭配职责:
- 比如人物衣着搭配的多样性
 - 比如搭配不同种类的咖啡
 - 比如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();
}好处
- 主要解决了“过度使用继承来扩展对象的功能”,过度继承会导致子类膨胀,且在子类不使用父类功能的情况下,不应该使用继承的方式
 - 把类的装饰功能从类中搬移出来,简化了原来的类
 - 把类的核心功能 和 装饰功能 区分开,而且也简化了重复的装饰逻辑
 
坏处
- 会产生很多的小对象,增加了系统的复杂性
 - 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。