|
首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP。AOP所关注的是传统OOP不能优雅解决的问题。(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美。)下面将就一个简单的例子来说明他们到底如何的不同。
作为一个使用OOP多年的人来说,当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题时,我觉得应该去探个究竟了。对两种技术的比较最能给我们实际应用提供见解。这里我设计了一个例子:一个OOP应用,其中某些方面适合使用AOP。
本文展示了一个简单的例子。一开始介绍了问题域,然后分别给出OOP与AOP的解决方案。后者使用了JDK5.0,JUnit,和AspectWerkz。最后说明如何编写代码。读完本文后,我希望你能知道AOP到底是什么,解决什么样的问题。(由于作者在后面AOP的例子中使用了Java5。0的批注(Annotation),建议读者先有所了解)
问题域描述
一个软件公司雇佣一个程序员,指定给他一个业务部门并要求他随时向经理报告。当团队成员完成他们的目标时,经理会给他们相应的奖金。公司所需要的方案必须能够增加一个新的雇员并给当前的员工增加奖金。为了方便,我们用CSV文件存储数据。
图1 解决方案模型
类Manager(经理)继承自类Employee,包含一个额外的属性,Managing Project。一个部门可能包含很多员工。多个部门构成了公司。暂不考虑公司这样的一个类,因为它在问题域之外。
解决方案设计
以下流程图描述了解决方案设计。
图2 对象之间的交互(增加一个新的员工,指派给他一个部门和经理)
出于简单的考虑,本文只关注必需的细节。当然你也可以深入代码得到你想要的其他信息。
[link]http://www.devx.com/assets/sourcecode/13172.zip[/link]
EmployeeServiceTestCase,一个JUnit测试用例,模拟一个最终用户,创建新员工记录,指派部门和经理。它获取所有可用的部门和经理数据并显示在图形界面上。
为了实例化域对象BusinessUnit和Manager,获得的记录将传递给工厂类。之后,通过给EmployeeService传递一个引用来创建一个Employee对象。
这个服务类使用EmployeeFactory创建对象,并把这个对象传给EmployeeRepository 来进行持久化操作。
应用程序中需要面向哪些"切面"
到目前为止,对模型和设计的讨论还限于一个较抽象的层面。现在,我转向这个应用的其他方面 - 这对理解AOP的价值至关重要。
1
2
3
4
下一页>>
|