`
chenhua_1984
  • 浏览: 1232927 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java 装饰器模式

阅读更多

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

   定义

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

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

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

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

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

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

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

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

 

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

程序12-22   源接口 Sourcable.java

package pattern.decorator;

public interface Sourcable {
	public void operation();

}
 

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

程序12-23   源类 Source.java

package pattern.decorator;

public class Source implements Sourcable {

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

}
 

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

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

package pattern.decorator;

public class Decorator1 implements Sourcable {

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

	}

}
 

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

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

package pattern.decorator;

public class Decorator2 implements Sourcable {

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

	}

}
 

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

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

package pattern.decorator;

public class Decorator3 implements Sourcable {

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

	}

}
 

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

程序12-27   测试类 DecoratorTest.java

package pattern.decorator;

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 个装饰器装饰后

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

 

分享到:
评论
11 楼 随便小屋 2014-11-21  
写的不错!
10 楼 大智若愚 2014-02-20  
非常漂亮!!
9 楼 Livon 2013-07-19  
赞一个!
8 楼 dengfuyou0719 2013-06-06  
7 楼 dengfuyou0719 2013-06-06  
6 楼 ilahsa 2013-01-31  
very good
5 楼 Ayin2767 2011-08-21  
写的非常好,浅显易懂。高手总是能将复杂的事情简单化。
4 楼 wwyu8901 2011-08-12  
好文章,搞懂了。。。
3 楼 speed_guo 2010-07-26  
讲得可以,浅显.
2 楼 javamanlcy007 2010-06-10  
不错,非常不错
1 楼 asialee 2010-01-09  
讲的比较通俗易懂。

相关推荐

    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