用AspectJ增强设计模式上
修饰器模式
从面向方面的角度来考虑,修饰器是一个有趣的模式,因为它是接近“消失”的模式之一,具有面向方面的语言(例如 AspectJ)所引入的能力。为什么这么说呢?如果深入研究修饰器在面向方面和面同对象实现中的演变,就会让事情变得更清晰。
修饰器模式的目标是动态地把功能添加到现有对象上。GoF 书中给出的规范示例包括文字修饰。在他们的示例中,GUI 组件类是在一个修饰器类中包装的,可以添加边框或者是滚动条来显示该组件。Java 类库明显非常支持修饰器,允许用java.util.Collections 的方法修饰 Collection,这样,集合就变成不可修改的或者是同步的,还有各种各样的 IO 流,它们可以缓冲、扩大或者监视其他流。
设置:监视文件读取
为了给这个示例增加一些趣味,我选择了 Java 发行包中的修饰器,用它来查看用 AspectJ 复制一个修饰器时需要做些什么。其中一个我觉得有趣的修饰器是来自 javax.swing 的 ProgressMonitorInputStream。根据记录,ProgressMonitorInputStream 监视底层输入流的读取进度。
为了演示修饰的实际效果,我编写了一个简单的读取文件的 GUI。可以在清单 2 中查看读取输入流的代码,还可以在图 1 看到运行的应用程序的截屏。(也可以单击这一页顶部或底部的 代码 图标,研究示例的完整源代码。)

图 1. 流的 ProgressMonitor
在考虑下面一节的时候,您可能想拥有 java.io 和 ProgressMonitorInputStream javadoc 或者源代码,请参阅 参考资料,以获得更多参考消息。
从面向方面的角度来考虑,修饰器是一个有趣的模式,因为它是接近“消失”的模式之一,具有面向方面的语言(例如 AspectJ)所引入的能力。为什么这么说呢?如果深入研究修饰器在面向方面和面同对象实现中的演变,就会让事情变得更清晰。
修饰器模式的目标是动态地把功能添加到现有对象上。GoF 书中给出的规范示例包括文字修饰。在他们的示例中,GUI 组件类是在一个修饰器类中包装的,可以添加边框或者是滚动条来显示该组件。Java 类库明显非常支持修饰器,允许用java.util.Collections 的方法修饰 Collection,这样,集合就变成不可修改的或者是同步的,还有各种各样的 IO 流,它们可以缓冲、扩大或者监视其他流。
设置:监视文件读取
为了给这个示例增加一些趣味,我选择了 Java 发行包中的修饰器,用它来查看用 AspectJ 复制一个修饰器时需要做些什么。其中一个我觉得有趣的修饰器是来自 javax.swing 的 ProgressMonitorInputStream。根据记录,ProgressMonitorInputStream 监视底层输入流的读取进度。
为了演示修饰的实际效果,我编写了一个简单的读取文件的 GUI。可以在清单 2 中查看读取输入流的代码,还可以在图 1 看到运行的应用程序的截屏。(也可以单击这一页顶部或底部的 代码 图标,研究示例的完整源代码。)

图 1. 流的 ProgressMonitor
在考虑下面一节的时候,您可能想拥有 java.io 和 ProgressMonitorInputStream javadoc 或者源代码,请参阅 参考资料,以获得更多参考消息。
0
相关文章