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