装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就是增加功能来说,装饰模式比生成子类更为灵活。
装饰模式(Decorator)结构图
Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
Component类
abstract class Component{ public abstract void Operation(); }
ConcreteComponent类
class ConcreteComponent extends Component{ public void Operation(){ //具体对象的操作 } }
Decorator类
class Decorator extends Component{ protected Component component; public void SetComponet(Component component){ this.component = component; } public void Operation(){ if(component != null){ component.Operation(); } } }
ConcreteDecoratorA类
class ConcreteDecoratorA extends Decorator{ private string addedState; base.Operation(); addedState = "New State"; //具体装饰对象A的操作 } class ConcreteDecoratorB extends Decorator{ public void Operation(){ base.Operation(); AddedBehavior(); //具体装饰对象B的操作 } private void AddedBehavior(){ //本类独有的方法,以区别与ConcreteDecoratorA } }
客户端代码:
static void Main(String[] args){ ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA d1 = new ConcreteDecoratorA(); ConcreteDecoratorB d2 = new ConcreteDecoratorB(); //装饰方法:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c //然后利用ConcreteDecoratorA的实例化对象d1来包装c,再利用ConcreteDecoratorB的对象d2包装d1, //最终执行d2的Operation() d1.SetComponet(c); d2.SetComponet(d1); d2.Operation(); }
装饰模式是利用SetComponent来对对象进行包装,这样每个装饰对象的实现就和如何利用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
装饰模式是为已有功能动态地添加更多功能的一种方式。何时使用装饰模式呢?
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。在主类中加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以再运行时根据需要有选择地、按顺序地使用装饰功能包装对象。