欢迎来到天天文库
浏览记录
ID:9060655
大小:612.26 KB
页数:139页
时间:2018-04-16
《用aop对设计模式进行改进》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、用AspectJ增强设计模式上设计模式长期以来一直是一些经验丰富的开发人员的工具箱的重要组成部分。不幸的是,因为模式可以影响多个类,所以它们也是侵入性的、难于使用(和重用)。本文是AOP@Work系列的第3部分,是一篇由两部分组成的文章,在这篇文章中,NicholasLesiecki将介绍AOP是怎样通过根本转变模式实现来解决这一问题的。他研究了三个经典的Gof设计模式(适配器模式、修饰器模式和观察者模式),同时还将讨论使用面向方面技术实现这些模式所带来的实践和设计方面的好处。什么是设计模式?根据DesignPatterns:ElementsofReu
2、sableObject-OrientedSoftware:设计模式系统地命名、促进和解释了解决面向对象系统中重复出现的设计问题的一个通用设计。它描述了问题、解决方案、何时应用该解决方案以及所产生的结果。它还提供了一些实现提示和示例。解决方案是解决问题的对象和类的总体安排。可以定制并实现解决方案,解决具体上下文环境中的问题。在多年成功地应用模式解决OO系统中的问题之后,我发现自己也认同了这个定义。模式是与普通程序员谈论设计的最好方式,它们代表解决“重复出现的设计问题”的最佳实践。所以,当我参加了StuartHalloway的一次访谈时,我感到有点震惊:他
3、为GoF提供了另一个头衔:“处理C++中破损事物的修理厂”。他的观点是:在一种语言中以“模式”方式存在的东西,在不同的范式下,可以融入语言本身。接着他给出了Factories的示例——该示例在Java语言中有用,但在Objective-C中却没多大用,后者支持从构造函数中返回子类型。我思考了很长一段时间,然后我认识到两个方面实际上说的是同一件事之前:设计模式提供了表达那些无法直接在编程语言中表达的概念的词汇表。那么,AOP位居何处呢?对于OOP,我们有GoF模式,它提供了处理公共的概念(像观察者和修饰器)的统一方法(尽管有时有点麻烦)。AOP构建在OO
4、P之上,提供了表达横切关注点的直接方式。它认为某些GoF模式是关于横切的,可以直接用AOP表示。所以您会注意到,对于一些包含许多类的模式,用一个方面就可以表达。有些模式变得更易使用,因为它们可以包含更少代码。有些模式得到了非常好的支持,以致于它们几乎消失不见。其他模式严格绑定到OOP(例如处理类结构的模式),所以它们在与AOP结合使用的时候保持不动。本文的目的是探索用AOP(特别是用AspectJ)进行的模式实现。我选择GoF模式,是因为它是一个非常流行和通用的工具。在本文的第1部分中,我要设置一些分析模式影响的指标,然后研究适配器和修饰器模式。适配器
5、会演示静态交叉的优势,而修饰器则会暴露它自身是一个正在消失的模式。在第2部分中,我将提供对观察者模式更加深入的研究,这种模式并没有消失,但您会看到在用AspectJ实现它时的一些主要好处。第2部分将显示AspectJ如何使模式转变成可重用的基本方面,从而允许您下载预先构建好的模式库——这是让模式爱好者们兴奋的一大优势。为什么把AOP应用到设计模式?我前面说过,许多模式都是横切的,当然我不是第一个想到这一点的人。最近有一篇研究论文对GoF模式进行了分析,分析发现:在23个模式中,有17个模式表现出某种程度的横切。(这篇论文是JanHannemann和Gr
6、egorKiczales合著的“JavaAspectJ中的设计模式实现”,请参阅参考资料一节,以获取更多细节。)如果AOP承诺可以协助解决横切,那么在设计模式上使用AOP有什么好处呢?我先从用通用术语回答这个问题开始,然后设置一个框架,通过它来考察每个设计模式。在设计模式上使用AOP的好处AOP第一个关键的好处是把指定设计模式的代码本地化的能力。这意味着通常只在一个方面或一对密切关联的方面上就可以实现模式。(这与Java语言实现形成对比,在Java语言实现中,模式应用程序可以分布在多个类中。)能够在一个地方看到所有代码会带来几个实际的好处。首先,如果模
7、式的所有交互都能在一个地方看到的话,那么阅读代码的人就能更容易地理解模式。其次,如果开发人员需要改变模式的实现,那么他或她就能在一个地方修改模式,而不用在整个系统中追踪模式的片断。最后,开发人员可以用有意义的名称描述封装模式的方面,为以后的维护人员提供有关模式意图的文字线索。例如,可以把方面命名为SensorAdapter,这表明在传感器上使用的是适配器模式。AspectJ模式实现的另一个关键好处就是遗忘性(obliviousness)。换句话说,在模式中发挥作用的类不必知道这个角色。这个好处直接来自本地化——因为模式是在某一个方面实现本地化的,所以不
8、需要冒犯其参与者。遗忘性让模式参与者更容易理解代码。不仅如此,遗忘性还让模式更容易组合。在Ja
此文档下载收益归作者所有