思想
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责或者 处理那些可以撤销的职责的时候可以使用。
在Unity中的组件就是使用了这种设计模式实现的组件扩展。
一般实现给人类增加衣服的写法
这样的实现方式当我要再加一顶帽子的时候必须要去修改Persion类,违背了开放-封闭原则
public class Persion{
public void AddJeans(){
Console.WriteLine("添加衣服");
}
public void AddSort(){
Console.WriteLine("添加T桖");
}
}
装饰模式实现
/// <summary>
/// 职责基类,定义添加职责的接口
/// </summary>
abstract class Component
{
public abstract void Operation();
}
定义一个对象,可以给这个对象添加一些职责
/// <summary>
/// 装饰类子类
/// </summary>
class ConcreteComponent:Component
{
public override void Operation()
{
Console.WriteLine("ConcreteComponent.Operation()");
}
}
维持一个指向Component的指针,并定义一个与Component接口一致的接口
class Decorator:Component
{
protected Component compoent;
public void SetCompoent(Component compoent)
{
this.compoent = compoent;
}
public override void Operation()
{
compoent.Operation();
}
}
具体的职责A
public class ConcreteDecoratorA : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreteDecoratorA.Operation()");
}
}
具体的职责B
public class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreteDecoratorA.Operation()");
}
}
具体的职责A
static void Main(string[] args)
{
// Create ConcreteComponent and two Decorators
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA(); //装饰1
ConcreteDecoratorB d2 = new ConcreteDecoratorB(); //装饰2
// Link decorators
d1.SetComponent(c); //将C装在装饰1上
d2.SetComponent(d1); //将装饰1装在装饰2上
d1.Operation(); //装饰1输出了c和自身
d2.Operation(); //装饰2输出了c,装饰1和自身
}