什么是装饰者模式:给爱用继承的人一个全新的设计眼界
装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新行为的设计模式。就功能而言,装饰者模式相比生成子类更加灵活,这样可以给某个对象而不是整个类添加一些功能。- 摘自维基百科
装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。- 摘自《HeadFirst设计模式》
装饰者模式的类图
装饰者模式的优点与不足
优点
- 装饰者模式与继承关系的目的都是为了扩展对象的功能,但是装饰者可以提供比继承更多的灵活性,比如可以在运行着扩展对象的功能,而继承在编译时就已经确定了;
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出不同行为的组合;
不足
- 比继承更灵活,也意味着更多的复杂性;
- 装饰者模式会导致设计中出现很多小类,如果过度使用,会是程序变得很复杂;(Java的IO包就够复杂了)
- 装饰者模式是针对抽象组件(Component)类型编程。但是,如果要针对具体组件编程时,就应该重新思考应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开方法,实现”半透明”的装饰者模式。在实际项目中作出最佳选择。
装饰者模式的使用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Java IO中装饰者模式的应用
Java I/O的组织
下面是一个典型的对象集合,用装饰者将功能结合起来,以读取文件数据:
其中BufferedInputStream和LineNumberInputStream都扩展自FilterInputStream,它是一个抽象的装饰类。
下面是java.io库的结构:
其实,”输出”流的设计方式也是一样的。此外,Reader/Writer流(作为基于字符数据的输入输出)和输入流/输出流相当类似。
但是,Java I/O也引出装饰者模式的一个”缺点”:利用装饰者模式,常常造成设计中有大量的小类,数量实在太多,可能会造成使用此API程序员的困扰。但是,如果你了解装饰者模式的工作原理,以后当使用别人的大量装饰API时,就可以很容易辨别出他们的装饰者类是如何组织的,以方便包装来取得想要的行为。
编写自己的Java I/O装饰者
|
|
|
|