快速业务通道

AOP@Work: 设计切入点来避免模式密集 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
方面应用于 Run:

public aspect CompositeRun extends AComposite { declare parents : Run implements IComposite; public pointcut recursing (IComposite c) : execution(void Run+.walk()) && target (c); }

将连接点封装为对象

在连接点上递归?这就是有趣的地方。在 AspectJ around 通知中,可以使用 proceed(..) 运行连接点的其他部分。为了实现递归,可以通过将 proceed(..) 调用封装在匿名类中来隐藏连接点的其他部分。为了在递归方法中传递,匿名类 应该扩展方法已知的包装器类型。比如,下面定义了 IClosure 包装器接口,将 proceed(..) 包装到 around 通知中,并把结果传递给 recurse(..) 方法:

// in aspect AComposite... /** used only when recursing here */ public interface IClosure { public void runNext(IComposite next); } /** when recursing, go through all subtree targets */ void around(IComposite c) : recursing(c) { recurseTop(c, new IClosure() { // define a closure to invoke below public void runNext(IComposite next) { proceed(next); }}); } /** For clients to find top of recursion. */ void recurseTop(IComposite targ, IClosure closure) { recurse(targ, closure); } /** Invoke targ or recurse through targ''s children. */ void recurse(IComposite targ, IClosure closure) { List children = (null == targ?null:targ.children); if ((null == children) || children.isEmpty()) { // assume no children means leaf to run closure.runNext(targ); } else { // assume children mean not a leaf to run for (Object next: children) { recurse((IComposite) next, closure); } } }

使用 IClosure 可以结合 Command 模式和使用 proceed(..) 的通知的优点。 与 Command 类似,它也可以用新规定的参数在运行或重新运行中传递。与 proceed(..) 类似,它隐藏了连接点中其他上下文、其他低优先级通知和底层连 接本身的细节。它和连接点一样通用,比通知更安全(因为上下文更加隐蔽), 并且和 Command 一样可以重用。因为对目标类型没有要求,所以,与 Command 相比,IClosure 的结合性更好。

如果逐渐习惯于封闭 proceed(..),不必感到奇怪,对许多 Java 开发人员来 说,这仅仅是一种很常见的怪事。如果在连接点完成之后调用 IClosure 对象, 那么结果可能有所不同。

AOP@Work: 设计切入点来避免模式密集(14)

时间:2011-09-04 IBM Wes Isberg

可用性

RunComposite 方面将这种组合解决方案应用于 Run 类,只需要用 IComposite 接口标记该类,并定义 recursing() 切入点即可。但是,为了将组 件安装到树中,需要添加子类,这意味着某个组装器组件必须知道 Run 是带有子 类的 IComposite。下面显示了组件以及它们之间的关系:

Assembler, knows about... Run component, and CompositeRun concrete aspect, who knows about... Run component, and AComposite abstract aspect

您可能希望让 CompositeRun 方面也负责发现每次运行的子类(就像带配置的 组合那样),但使用单独的装配器意味着不必将 Run 组合(对于所有运行都是一 样的)与 Run 组合的特定应用(随着联系子类和特定 Run 子类的方式不同而变 )搅在一起。面向对象依赖性的规则依赖于稳定性的方向,特别是,(变化更多 的)具体的元素应该取决于是否要完全依赖于(更稳定的)抽象成分。按照这一 原则,上面的依赖性似乎不错。

结合性

与配置一样,组合通知(应用于测试用例时)应该优先于装置和结果报告。如 果配置影响到测试的确认,那么组合也应该优先于配置。按照这些约束,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号