《高级软件架构师讲义》学习笔记六-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
相关文章推荐
- 前端学习心得-javascript设计模式与开发实践-AOP面向切面编程
- AOP开发实践
- 《敏捷软件开发 ——原则、模式、与实践》学习笔记(2)
- AOP开发实践(zz)
- iOS开发之深入了解Objective-C Runtime、Method Swizzling、Method Swizzling 和 AOP 实践
- 《敏捷软件开发 ——原则、模式、与实践》学习笔记(1)
- HoloLens开发与性能优化实践
- AutoCAD二次开发(.net教程)C#版——学习笔记(二)
- Android开发实践:掌握Camera的预览方向和拍照方向
- Struts+Hibernate开发实践 分页的实现
- 电警卡口项目开发实践
- Android 开发之旅:短信的收发及在android模拟器之间实践(二)
- Spring学习-21:Spring的AOP:基于AspectJ的注解开发
- VC下ADO开发实践
- Spring学习-22:Spring的AOP:基于AspectJ的XML配置方式开发
- Cesium开发实践(二)模拟多架飞机飞行
- 《银光志-Silverlight 3.0开发详解与最佳实践》发行第三版总销量过万册
- (Flash) Air For ipad/iphone 程序开发实践
- 软件项目需求开发过程实践之业务建模用例图
- 敏捷开发“松结对编程”实践之一:人员结构篇(大型研发团队,学习型团队,139团队,师徒制度)