Decorator:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活;
以下为装饰模式的UML图:
1. Component是定义一个对象接口,可以给这些对象动态添加职责;
2. ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责;
3. Decorator是装饰抽象类,继承了component,从外来类扩展component的功能,但是对于component来说,是无需知道Decorator存在的;
4. 其余继承了Decorator就是具体的装饰类,给component添加职责的功能;
以下为实现代码: public abstract class Component
{
public abstract void Operation();
}
public class ConcreateComponent : Component
{
public override void Operation()
{
Console.WriteLine("ConcreateComponent");
}
}
public abstract class Decorator : Component
{
private Component _concreateComponent;
public void SetDecorator(Component concreateComponent)
{
this._concreateComponent = concreateComponent;
}
public override void Operation()
{
if (_concreateComponent != null)
_concreateComponent.Operation();
}
}
public class ConcreateDecoratorA : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreateDecoratorA");
}
}
public class ConcreateDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreateDecoratorB");
}
}
客户端的调用代码:
ConcreateComponent com = new ConcreateComponent();
ConcreateDecoratorA comA = new ConcreateDecoratorA();
ConcreateDecoratorB comB = new ConcreateDecoratorB();
comA.SetDecorator(com);
comB.SetDecorator(comA);
comB.Operation();
代码执行步骤:
1. 实例化ConcreateComponent、ConcreateDecoratorA、ConcreateDecoratorB三个对象;继承对象的实例化顺序为:先实例化准备实例化的父类,依次往上直至object类,实例化的顺序为从object开始依次往下实例化,直至实例化到待实例化的对象;
2. comA继承自Decorator,所以comA类继承了变量_concreateComponent和方法SetDecorator(),comA.SetDecorator(com)执行的是:将comA父类的实例的变量concreateComponent赋值为com;
3. comB继承自Decorator,所以comB类继承变量_concreateComponent和方法SetDecorator(),comB.SetDecorator(comA)执行的是:将comB父类的实例的变量concreateComponent赋值为comA;
4. comB.Operation()执行步骤为:
a. 调用comB的Operation()方法,执行到comB的Operation方法的base.Operation()句时,就是执行DecoratorB的Operation()方法,该方法调用了DecoratorB的_concreateComponent变量,该变量在comB.SetDecorator(comA)中被赋予了值comA;
b. 调用comA的Operation()方法,执行到comA的Operation方法的base.Operation()句时,就是执行DecoratorA的Operation()方法,该方法调用了DecoratorA的_concreateComponent变量,该变量在comA.SetDecorator(com)中被赋予了值com;
c. 调用com的Operation()方法,输出ConcreateComponent,代码此时开始反向跳转,依次输出ConcreateDecoratorA和ConcreateDecoratorB