装饰(Decorator)模式又名包装(Wrapper)模式[GOF95]。装饰模式以对客户端透明的方 式扩展对象的功能,是继承关系的一个替代方案。
装饰模式类图:
类图说明:
抽象构件(Component)角色:给出一个抽象接口,以 规范准备接收附加责任的对象。
具体构件(Concrete Component)角色:定义一个将 要接收附加责任的类。
装饰(Decorator)角色:持有一个构件(Component) 对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对 象"贴上"附加的责任
示例代码:
class Program { static void Main(string[] args) { Component component = new ConcreteComponent(); ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(); ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(); decoratorA.SetComponent(component); decoratorB.SetComponent(decoratorA); decoratorB.Operation(); Console.ReadKey(); } } abstract class Component { public abstract void Operation(); } class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("ConcreteComponent.OPeration"); } } abstract class Decorator : Component { protected Component compontent; public void SetComponent(Component compontent) { this.compontent = compontent; } public override void Operation() { if (compontent != null) { compontent.Operation(); } } } class ConcreteDecoratorA : Decorator { public override void Operation() { base.Operation(); AddedBehavior(); Console.WriteLine("ConcreteDecoratorA.Operation()"); } void AddedBehavior() { } } class ConcreteDecoratorB : Decorator { // Methods override public void Operation() { base.Operation(); AddedBehavior(); Console.WriteLine("ConcreteDecoratorB.Operation()"); } void AddedBehavior() { } }