这里似乎可以解释之前的一个疑惑:
装饰器模式与对象的适配器模式的异同: 相同点:都拥有一个目标对象 不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口 换句话说,适配器模式就是把一个对象是配成另一个对象,而装饰器模式将丰富目标对象的功能但不改变它的接口 |
Decorator装饰器,动态的给一个对象添加一些额外的职责 具有如下特征: 它必须具有一个装饰对象 它必须拥有与装饰对象相同的接口 它可以被装饰对象添加额外的功能 |
源接口: public interface Sourcable { public void operation(); } |
源类: public class Source implements Sourcable{ @Override public void operation() { // TODO Auto-generated method stub System.out.println("原始类的方法"); } } |
装饰器类: public class Decorator1 implements Sourcable{ private Sourcable source; public Decorator1(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第1个装饰器装饰前"); source.operation(); System.out.println("第1个装饰器装饰后"); } } |
装饰器类: public class Decorator2 implements Sourcable{ private Sourcable source; public Decorator2(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第2个装饰器装饰前"); source.operation(); System.out.println("第2个装饰器装饰后"); } } |
装饰器类: public class Decorator3 implements Sourcable{ private Sourcable source; public Decorator3(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第3个装饰器装饰前"); source.operation(); System.out.println("第3个装饰器装饰后"); } } |
测试类 : public class DecoratorTest { public static void main(String[] args) { Sourcable source=new Source(); Sourcable obj=new Decorator1( new Decorator2( new Decorator3(source))); // Sourcable obj=new Decorator2(source); obj.operation(); } } |
结果: 第1个装饰器装饰前 第2个装饰器装饰前 第3个装饰器装饰前 原始类的方法 第3个装饰器装饰后 第2个装饰器装饰后 第1个装饰器装饰后 |
在以下情况使用: 需要扩展一个类的功能,或者给一个类增加附加的功能 需要给一个对象增加功能,这些功能可以动态撤销 需要增加由一些基本排列组合产生大量的功能,从而使继承关系变得不现实 |
缺点: 较少的使用类,但会产生更多的对象,在进行错误查询时变得更困难。 |