面向方面开发

来源:互联网 发布:顺丰软件下载 编辑:程序博客网 时间:2024/05/19 11:48

       面向方面的目的是分离出横向关联的共通侧面。什么是横向关联?什么是共通侧面?什么是方面?

       面向对象是以对象为单位,横向关联指涉及到多个对象,如果对象中都有共通的逻辑,这就是共通侧面。横跨多个类的共同关注的事就是方面(Aspect)。

       面向方面的编程(AOP)就是针对共同关注的事进行开发。比较典型的场景如日志记录、调试信息、安全认证等。

       为何不用继承实现共通的逻辑?一种情况是不同类型的对象期望有共通的逻辑,但它们不能继承同样的基类,但又不想复制代码破坏DRY(don't repeat yourself)规则。另一种情况是不希望更改(或不能更改)原有类的定义,同时又不能更改接口定义,比如调用第三方web service,这就需要一种动态的方法注入自己的逻辑。

       有四个关键的 AOP 术语:

  • 接合点 (Joinpoint) — 代码中定义明确的可识别的点。

  • 切点 (Pointcut) — 通过配置或编码指定接合点的一种方法。

  • 通知 (Advice) — 表示需要执行交叉切割动作的一种方法

  • 混入 (Mixin) — 通过将一个类的实例混入目标类的实例引入新行为。

       接合点一般指被调用的原有方法。切点指注册的手段,可以通过XML配置,也可以通过代码注入。通知指要注入的方法。混入在实现上就是在目标对象上添加方法。这些只是方便理解,不代表真正含义。

       如果是动态语言,一般都支持开放类,可以很容易的向已有对象添加和修改方法,实现AOP比较容易。如果是静态语言,可以通过继承原有类,并引用要混入的对象,将调用委托给混入对象来实现。如果是托管语言(如Java、C#),也可以通过反射实现。

       另一种更有用的方式是组合混入。比如已有数据对象,需要混入保存和修改的方法,之后又需要实现对数据的同步功能,这就需要在保存和修改时记录数据的状态,以便同步时可以比对版本。AOP可以实现不同方面的组合,当调用保存方法时,会自动调用更新状态方法。


       参考面向方面的编程