您的位置:首页 > 运维架构 > 网站架构

《高级软件架构师讲义》学习笔记六-AOP开发实践

2009-01-19 10:19 204 查看

第六章 AOP开发实践

一、什么是AOP?

AOP是Aspect Oriented Programming的简写,中文通常译作面向方面编程,其核心内容就是所谓的“横切关注点”。

1. OO是纵向结构的

使用面向对象方法构建软件系统,我们可以利用OO的特性,很好的解决纵向的问题,因为,OO的核心概念,如继承等,都是纵向结构的。

2. AOP的目标

􀁺 但是,在软件系统中,往往有很多模块,或者很多类共享某个行为,或者说,某个行为存在于软件的各个部分中,这个行为可以看作是“横向”存在于软件之中,他所关注的是软件的各个部分的一些共有的行为,而且,在很多情况下,这种行为不属于业务逻辑的一部分。

􀁺 例如,操作日志的记录,这种操作并不是业务逻辑调用的必须部分,但是,我们却往往不得在代码中显式进行调用,并承担由此带来的后果(例如,当日志记录的接口发生变化时,不得不对调用代码进行修改)。

􀁺 这种问题,使用传统的OO方法是很难解决的。AOP的目标,便是要将这些“横切关注点”与业务逻辑代码相分离,从而得到更好的软件结构以及性能、稳定性等方面的好处。

public class BusinessClass
{
public void BusinessMethod()
{
Security s = new Security();
if (!s. CheckRight(……))
{
return ;
}
……//执行业务逻辑
}
}
• 不清晰的业务逻辑:从某种意义上来说,权限校验过程并不是业务逻辑执行

的一部分,这个工作是属于系统的,但是,在这种情况下,我们不得不把系

统的权限校验过程和业务逻辑执行过程掺杂在一起,造成代码的混乱。

• 代码浪费:使用这种方法,我们必须所有的业务逻辑代码中用Security类,使

得同样校验的代码充斥在整个软件中,显然不是很好的现象。

• 紧耦合:使用这种方法,我们必须在业务逻辑代码中显式引用Security类,这

就造成了业务逻辑代码同Security类的紧耦合,这意味着,当Security发生变

化时,例如,当系统进化时,需要对CheckRight的方法进行改动时,可能会

影响到所有引用代码。下面所有的问题都是因此而来。

• 不易扩展:在这里,我们只是在业务逻辑中添加了权限校验,哪一天,当我

们需要添加额外的功能,例如日志记录功能的时候,我们不得不同样在所有

的业务逻辑代码中添加这个功能。

• 不灵活:有的时候,由于某些特定的需要,我们需要暂时禁止,或者添加某

项功能,采用传统的如上述的做法,我们不得不采用修改源代码的方式来实

现。

4. 使用AOP组合两个业务逻辑

使用AOP,我们不仅仅可以用来分离系统功能和业务逻辑,也可以用来耦合不同的业务逻辑,得到更加灵活的软件结构。下面,我们通过一个具体的案例,来看看怎么通过AOP,组合两个业务逻辑过程。使用AOP,我们可以通过一种更加自然的方式来实现这个

目标。基本方法如下:

• 首先,编写相关的库存商品报废业务逻辑,不需要添加任何其他

的内容,并且,把这个逻辑的代码设置为可AOP的。

• 其次,按照正常的方式,编写财务处理逻辑。

• 添加一个把库存商品报废业务逻辑和财务处理逻辑组合起来的

Aspect,这个Aspect可以拦截库存商品报废业务逻辑的执行,动

态的加入财务处理逻辑的过程,并且,在配置文件中进行配置。

• 这样,我们就通过一个Aspect,组合了这两个业务逻辑。并且,

我们随时可以通过修改配置文件的方式把财务处理从库存商品报

废业务逻辑中去除,而不用修改任何代码。

三、对象代理和过滤器

1. 应该认识到,完全的AOP实现,需要开发语言的支持。因为对于AOP的研究,还正在进行之中,目前的开发语言,都还没有完全支持AOP的,但是,我们可以利用现有的一些语言功能,来实现AOP的部分功能。

2. 上面所举的例子,在实现上,是利用了对象代理(Proxy)机制。所谓Proxy,就是“为其他对象提供一种代理以控制对这个对象的访问”

四、结论

AOP给了我们一个新的视角来看待软件的架构,有的时候,即使不使用AOP技术,只使用AOP的某些观念和现有的技术来搭建系统架构,分离某些本来是紧耦合的关注点,对我们也是非常有益的。

文中介绍了一个.Net的AOP框架Websharp Aspect,不过在AOP框架这方面.Net好像没有Java阵营成熟。

原教程大家可以到豆丁网下载http://www.docin.com/p-1138875.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: