设计模式初探-装饰模式(二)

2014-11-24 03:22:01 · 作者: · 浏览: 4
press(stream)); } /* * 额外职责 */ private String compress(String stream){ System.out.println("压缩数据"); return "压缩["+stream+"]"; } }运行结果:

往内存中写入流...
从内存中读取流...
======使用默认装饰类:test123
压缩数据
往内存中写入流...
从内存中读取流...
======使用压缩装饰类:压缩[test123]
将数据转换为7位ASCII码
往文件中写入流...
从文件中读取流...
======使用ASCII装饰类:ASCII[test123]
将数据转换为7位ASCII码
压缩数据
往文件中写入流...
从文件中读取流...
======使用ASCII和压缩装饰类:压缩[ASCII[test123]]

四、模式优缺点

优点:

1、 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。
2、可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为。
3、可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。
4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则”。

5、避免在层次结构高层的类有太多的特征。高层的类越简单,其可扩展性,灵活性越好。可以定义一个简单的类,然后使用Decorator类给它逐渐添加功能。

缺点:

1、 使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,大量小对象的产生势必会占用更多的系统资源,在一定程序上影响程序的性能,也增大了学习系统的复杂度。
2、装饰模式提供了一种比继承更加灵活机动的解决方案,但同时也意味着比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐。

3、Decorator与它的Component不一样,Decorator只是透明的包装,所以客户端使用时不应该依赖Decorator。