美文网首页我爱编程
Java设计模式-装饰器模式

Java设计模式-装饰器模式

作者: 木有粗面_9602 | 来源:发表于2018-04-14 15:34 被阅读22次

Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式。

一、定义:

Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:

  • 它必须具有一个装饰的对象
  • 它必须拥有与被装饰对象相同的接口
  • 它可以给被装饰对象添加额外的功能

用一句话总结就是:保持接口,增强性能。

二、 典型的装饰器模式的图:

image.png

三、相关实例:

1、 Sourcable接口定义了一个方法 operation() 。

package pattern.decorator;     
public interface Sourcable {    
    public void operation();    
}  

2、被装饰对象: Source.java 是 Sourcable.java 的一个实现, operation() 方法的实现就是简单的负责往控制台输出一个字符串:

public class Source implements Sourcable {    
    
    public void operation() {    
        System.out.println("原始类的方法");    
    }    
    
}    

3、装饰器类 Decorator1.java 采用了典型的对象适配器模式,它首先拥有一个 Sourcable 对象 source ,该对象通过构造函 数进行初始化。然后它实现了 Sourcable.java 接口,以期保持与 source 同样的接口,并在重写的operation() 方法中调用 source 的 operation() 函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。

public class Decorator1 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator1(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
        
    public void operation() {    
        System.out.println("第1个装饰器前");    
        sourcable.operation();    
        System.out.println("第1个装饰器后");    
    }     
}    

装饰器类Decorator2.java 是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如

public class Decorator2 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator2(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
    public void operation() {    
        System.out.println("第2个装饰器前");    
        sourcable.operation();    
        System.out.println("第2个装饰器后");    
    
    }    
    
}    

装饰器类Decorator3.java 是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序

public class Decorator3 implements Sourcable {    
    
    private Sourcable sourcable;    
    public Decorator3(Sourcable sourcable){    
        super();    
        this.sourcable=sourcable;    
    }    
    public void operation() {    
        System.out.println("第3个装饰器前");    
        sourcable.operation();    
        System.out.println("第3个装饰器后");    
    
    }    
    
}    

这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如下测试类:首先需要创建一 个源类对象 source ,然后根据将对象使用 Decorator1 来装饰,并以此使用Decorator2 、 Decorator3 进行装饰,装饰后的对象同样具有与 source 同样的接口。

public class DecoratorTest {    
   
   /**  
    * @param args  
    */    
   public static void main(String[] args) {    
       Sourcable source = new Source();    
   
       // 装饰类对象     
       Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));    
       obj.operation();    
   }    
   
}    

程序运行结果:
第1 个装饰器装饰前
第2 个装饰器装饰前
第3 个装饰器装饰前
原始类的方法
第3 个装饰器装饰后
第2 个装饰器装饰后
第1 个装饰器装饰后

总结:
装饰器类:使用被装饰器对象作为成员变量,同时实现相同的接口。实现相同的接口,做成员变量

相关文章

网友评论

    本文标题:Java设计模式-装饰器模式

    本文链接:https://www.haomeiwen.com/subject/jgslkftx.html