图8: 适配器模式
适配器的方法似乎是十分合理的。但如果你有一个传统的系统,但是它不是使用像适配器这样的模式设计的。最初的设计人员没有意识到将来变化的可能性。同时,对于服务的调用可能贯穿于整个应用程序。你将如何实现一个新的,改进的服务?没有方面,你将可能重新生成系统,将每一个调用定位于服务,设计一个适配器,并执行Adapter模式。这取决于旧服务被调用地点的数量,这个可能是一个十分使人畏惧的任务。重新改进编码是一个有价值的目标;然而,我们不会总那么奢侈。我们必须在时间的限制之下尽最大努力来满足于改进编码。
在这种情况下,我们可以建立Adapter模式的一个版本来解决即时的问题和为一个更有组织的,更好设计的系统提供一个步骤。
使用一个服务的简单客户显示在图9中。服务将返回从一个点到当前Client对象的距离。
图9: 简单客户
对于服务的接口描述了一个简单的方法:
double useService(Client clt, double x, double y);
新改进的服务提供者有一个使用不同参数命名的方法,它的接口是:
double useNewService(double x0, double x1, double y0, double y1);
我们要建立一个适配器,它将位于旧服务的调用之间,为新服务得到合适的实参,调用新服务,然后将结果返回到客户——不必改变客户。如图10所示:
图10: 调用新服务的适配器方面
注意方面是多么简单。我们说明一个切入点来识别对原始服务的useService方法的每一个调用。然后在从调用客户中抽取需要的信息之后,我们使用around通知,用新服务的一个调用来替代那个调用。
这个方法有不少好处和优势。第一,我们可以用一个简单的方面来改变贯穿于应用程序中的所有编码。我们还将业务整合成在一个地点调用服务。现在,如果一个新服务被一个更新的服务所替代,我们只需要改变这个方面的编码。这些对于一个更加稳固的系统当然是有好处的。
主要优势是旧客户仍然在系统中,即使它不被使用。如果我们有时间(我们似乎从来都没有),我们将最有可能返回并重新生成系统,来使用一个更加标准的Adapter模式。最起码,我们可以使用编码修改原始服务的useService程序来返回一个如0.0的哑值,因为它从来不被调用。
工业上的应用
到目前为止,我们已经了解了一个十分有限但却有用的应用AOP的实例。我们可能要问技术上的提高比例会怎么样。有一个很明显的例子,我将在这里指出并简要描述一下。更加详细的内容请参见这个专栏的另一篇文章。
你们中的一些人可能熟悉 Spring 框架。7 Spring 框架是一个应用程序框架,它支持开发企业应用程序。它提供了一个分层的J2EE框架来建立复杂的企业应用程序。用于Spring的基础技术之一是AOP。Spring已经开发了它自己的面向方面的实现,它允许交叉的逻辑在运行时刻被应用到编码中,而不用通过一个像AspectJ的编译程序来实现。然而,它提了供集成特性让你容易地将AspectJ和Spring 框架结合在一起。
Spring 当前正被很多组织使用来建立更好的企业应用程序,它们被很好地设计以及需要很少的开发时间。据我估计,它是我们如何将方面应用于真实问题的一个极好的例子。8
我们将从这里去向何方?
在我看来,AOP将来将变成软件开发人员的工具包的一部分。我不知道是否我们将会达到在构建系统时将AOP作为主要设计机制的地步,但是我认为我们将会找到使用方面来增强我们的面向对象设计的方法。需要做许多事情来帮助加速这个过程。
第一,我们需要一些稳定的标准AOP实现。这个过程已经开始了。AspectJ的版本5是两种最流行的Java AOP语言,AspectJ和AspectWerkz的合并。在如C 的其它语言中的标准实现也会有帮助。
第二,我们需要确立一些能够使我们可以推断将AOP应用到特定系统的有效性的度量。例如,当我们使用AOP重新实现设计模式时,它们要比标准的面向对象模式好一些吗?在哪些地方它们更好而哪些地方不是呢?我们必须采取什么措施来得到信息和开发这些度量呢?天真方法的日子——我们相信如果一个系统是面向对象的(或选择你的技术),那么它是好的——结束了。我们需要在经验数据的基础之上作出设计和实现的决定。9
第三,我们需要继续开发支持AOP的工具。我很高兴地说,Eclipse的新AJDT是一套很好的工具。这些工具继续改进对我们的支持能力,我们需要高效地并有效率地使用方面。工具也必须支持一个处理方面的新过程。
方面仍然呆在这里。它们仍然没有成为主流应用程序一部分的一个方法,但它们每一天都变得更加接近。我推荐你多关注它们并超越这条曲线。
注释
1 关于AspectC 的信息可见于http://www.aspectc.org/以及关于AspectL的信息可参考http://common-lisp.net/project/closer/aspectl.html
2Rational Edge的2004年2月版:http://www.ibm.com/developerworks/rational/library/2782.html
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


