`
wusuoya
  • 浏览: 629371 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

java 装饰器模式

 
阅读更多

记得以前听一个高手说java.io包采用了了装饰器模式,当时不是很明白什么事装饰器模式,现在,网上看了一下说明和帮助的例子,他们的例子是这样的。

   定义

 

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

 

它必须具有一个装饰的对象。

 

它必须拥有与被装饰对象相同的接口。

 

它可以给被装饰对象添加额外的功能。

 

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

 

装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。

 

相同点:都拥有一个目标对象。

 

不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。

 

 

 

Sourcable类的源代码如程序 12-22 所示,其定义了一个接口函数 operation()

 

程序12-22   源接口 Sourcable.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public interface Sourcable {  
  4.     public void operation();  
  5.   
  6. }  

 

2 Source.java Sourcable.java 的一个实现,其函数 operation() 负责往控制台输出一个字符串:原始类的方法。其源代码如程序 12-23 所示。

 

程序12-23   源类 Source.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public class Source implements Sourcable {  
  4.   
  5.     public void operation() {  
  6.         System.out.println("原始类的方法");  
  7.     }  
  8.   
  9. }  

 

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

 

程序12-24   装饰器类 Decorator1.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public class Decorator1 implements Sourcable {  
  4.   
  5.     private Sourcable sourcable;  
  6.     public Decorator1(Sourcable sourcable){  
  7.         super();  
  8.         this.sourcable=sourcable;  
  9.     }  
  10.       
  11.     public void operation() {  
  12.         System.out.println("第一个装饰器前");  
  13.         sourcable.operation();  
  14.         System.out.println("第一个装饰器后");  
  15.   
  16.     }  
  17.   
  18. }  

 

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

 

程序12-25   装饰器类 Decorator2.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public class Decorator2 implements Sourcable {  
  4.   
  5.     private Sourcable sourcable;  
  6.     public Decorator2(Sourcable sourcable){  
  7.         super();  
  8.         this.sourcable=sourcable;  
  9.     }  
  10.     public void operation() {  
  11.         System.out.println("第二个装饰器前");  
  12.         sourcable.operation();  
  13.         System.out.println("第二个装饰器后");  
  14.   
  15.     }  
  16.   
  17. }  

 

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

 

程序12-26   装饰器类 Decorator3.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public class Decorator3 implements Sourcable {  
  4.   
  5.     private Sourcable sourcable;  
  6.     public Decorator3(Sourcable sourcable){  
  7.         super();  
  8.         this.sourcable=sourcable;  
  9.     }  
  10.     public void operation() {  
  11.         System.out.println("第三个装饰器前");  
  12.         sourcable.operation();  
  13.         System.out.println("第三个装饰器后");  
  14.   
  15.     }  
  16.   
  17. }  

 

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

 

程序12-27   测试类 DecoratorTest.java

 

Java代码  收藏代码
  1. package pattern.decorator;  
  2.   
  3. public class DecoratorTest {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         Sourcable source = new Source();  
  10.   
  11.         // 装饰类对象   
  12.         Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));  
  13.         obj.operation();  
  14.     }  
  15.   
  16. }  

 

运行该程序的输出如下:

 

1 个装饰器装饰前

 

2 个装饰器装饰前

 

3 个装饰器装饰前

 

原始类的方法

 

3 个装饰器装饰后

 

2 个装饰器装饰后

 

1 个装饰器装饰后

从输出的结果(多态)可以看出,原始类对象source 依次被 Decorator1 Decorator2 Decorator3 进行了装饰。

分享到:
评论

相关推荐

    JAVA设计模式学习12——装饰器模式

    NULL 博文链接:https://alaric.iteye.com/blog/1911949

    装饰模式小猪快跑游戏模拟

    装饰模式的一个简单实例,小猪吃苹果的游戏,每吃一种苹果,增加一种不同的功能。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。

    java实现装饰器模式(Decorator Pattern)

    主要为大家详细介绍了java实现装饰器模式Decorator Pattern,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java常用设计模式-装饰器模式

    java常用设计模式-装饰器模式

    Java装饰器设计模式_动力节点Java学院整理

    使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能...

    装饰器模式

    设计模式 java 装饰器

    java常用23中设计模式

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

    Java设计模式之装饰器模式.docx

    实际上Java提供的工具包中,IO相关工具就普遍大量使用了装饰器模式,例如充当装饰功能的IO类如BufferedInputStream等,又被称为高级流,通常将基本流作为高级流构造器的参数传入,将其作为高级流的一个关联对象,...

    50丨装饰器模式:通过剖析JavaIO类库源码学习装饰器模式1

    这也是我们在第 10 节中讲的不推荐使用继承的原因。基于装饰器模式的设计方案在第 10 节中,我们还讲到“组合优于继承”,可以“使用组合来替代继承”。针对刚刚的

    设计模式_装饰器模式.zip

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...

    java设计模式示例

    结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态...

    java设计模式

    27.3.3 解释器模式使用的场景 27.3.4 解释器模式的注意事项 27.4 最佳实践 第28章 享元模式 28.1 内存溢出,司空见惯 28.2 享元模式的定义 28.3 享元模式的应用 28.3.1 享元模式优点和缺点 28.3.2 享元模式的应用 ...

    33种JAVA设计模式DEMO

    装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of ...

    Java常用设计模式例子

    以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...

    用Java实现23种设计模式

    装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command ...

    java23种设计模式

    010迭代器模式 011组合模式8 \7 e- [% }# B5 p2 S 012状态模式 M% S6 a. `. h# h! h. F 013代理模式8 g( r/ i6 W3 q9 z; ~$ O 014复合模式 015桥接模式 016生成器模式 017责任链模式 018蝇量模式 019解释器模式 020...

    java种设计模式详解

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    Java23种设计模式可直接运行Demo

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器...

Global site tag (gtag.js) - Google Analytics