装饰器模式

Posted 海小鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器模式相关的知识,希望对你有一定的参考价值。

 

  装饰器模式,顾名思义,拘束将某个类重新装扮一下,使得它比原来更“漂亮”, 或者在功能上更强大,这就是装饰器模式所要达到的目的。但是作为原来的这个类的使用者,还不应该感受到装饰前和装饰后又什么不同,否则就破坏了原有类的结构了。

  装饰器模式有如下结构:

  ? Component:抽象组件,定义了一组抽象的接口,规定这个被装饰类有哪些功能。

  ? ConcreteComponent: 实现这个抽象组件的所有功能。

  ? Decorator:装饰器角色, 它持有一个Component 对象实例的引用。

  ? ConcreteDecorator:具体的装饰器实现者,负责实现装饰器角色定义的功能。

  好了,下面直接上代码:

  1、先定义一个抽象组件 Component:

package com.hd.decorator;

public interface Component {
    void Operation();
}

 

  2、再实现这个抽象组件的功能

package com.hd.decorator;

public class ConcreteComponent implements Component {

    @Override
    public void Operation() {
        System.out.println("具体抽象组件的功能");
    }
}

 

  3、定义一个装饰器类

package com.hd.decorator;

public class Decorator implements Component {

    protected Component component;
    public void setComponent(Component component){
        this.component = component;
    }
    @Override
    public void Operation() {
        if(component != null){
            component.Operation();
        }
        
    }
}

 

  4、再定义装饰器的实现者:

package com.hd.decorator;

public class ConcreteDecoratorA extends Decorator {

    @Override
    public void Operation() {
        System.out.println("加上装饰功能A...");
        super.Operation();
    }
}
package com.hd.decorator;

public class ConcreteDecoratorB extends Decorator {

    @Override
    public void Operation() {
        System.out.println("加上装饰功能B...");
        super.Operation();
    }
}

 

  5、下面测试一下:

package com.hd.decorator;

public class TestDecorator {

    public static void main(String[] args) {
        Component c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA();
        ConcreteDecoratorB d2 = new ConcreteDecoratorB();
        
        d1.setComponent(c);
        d2.setComponent(d1);
        d2.Operation();

    }

}

  结果如下:

加上装饰功能B...
加上装饰功能A...
具体抽象组件的功能

 

  装饰器和适配器模式,他们看似都是起到包装一个类或者对象的作用,但是使用他们的目的很不一样。

  适配器模式的意思是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的; 而装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方法而提升性能。所以这两个模式设计的目的是不同的。

以上是关于装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰器模式

装饰器模式问题 - 如何调用嵌套装饰器方法?

学习设计模式之装饰器模式

装饰器模式

PHP 装饰器模式

设计模式之装饰器模式