Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
这两个概念基本上是一个设计层的概念,主要讲的就是怎么去分离关注,用面向
对象的话说,就是怎么把职责进行分离。而这两个模式,我个人认为都有一个共
同点,就是变以前的主动为被动,而我认为,这种改变可能也是将来面向对象发
展的一个趋势。
首先说说什么叫主动。写过面向对象程序的人都知道,面向对象与面向过程的区
别就是,面向对象是由一大堆对象组成的,对象通过协作完成面向过程中的任务
。假设现在有对象A和B,那么当A需要使用B中的方法时,那么在A内部,就会有有
一个对B方法的调用,这种调用就称为主动调用。代码大概会如下:
public class A{
B b;
public void methodA(){
b.methodB();
}
}
这里为了下文解释方便,我增加了一个调用点的定义,调用点就是调用发生的地
方。也就是上面
b.methodB()中的b。
理解了什么叫主动之后,我想就先介绍什么叫IoC。IoC的全称这里就不说了,他
的字面意思就是控制反转。在上面的代码当中,由于A调用了B的方法,因此就形
成了一个A对B的依赖,这本身并没有什么问题。但是OO的思想是希望我们基于接
口编程,而不是基于实现编程。因此,系统设计将不止是原有的 A,B,而需要变
成IA,IB,A,B,其中IA,IB是接口,A,B是对应的实现类,然后为了使得A中现
在对B的实现依赖变成对接口的依赖,代码应该变成这样。
public class A implements IA{
IB b;
public void methodA(){
b.methodB();
}
}
这里虽然我们是基于接口编程了,但大家知道,在这中间,我们需要有一个步骤
把b指向一个IB的实现类B,这个怎么做,就是IoC要做的事情,这里就不细说了。
但简单来说,没有IoC,我们可能需要在A中通过某种方法去获取一个B的实例,但
有了IoC,她就能在A不参与的情况下,给我们一个B的实例,所以,IoC要做的就
是在调用点上从原来的主动生成一个调用点,变成被动的接受一个调用点。
接着就是AOP,全称也不说了,字面意思就是面向方面编程。举一个最普遍的例子
,就是如果我们代码需要做日志的话,那么在没有AOP的时候,我们的代码可能就
是这样:
public class A{
public void methodA(){
do log;
b.methodB();
}
}
这里methodA()中的做日志并不是方法本身的逻辑功能,而是一个附属功能,因此
,我们需要把它分离出去。怎么分离,就是AOP要做的事情,简单来说,就是系统
在调用者不知情的情况下,为我们的类A增加了一个代理类,她把我们的类A包装
了起来,像这样:
public class AP extends A{
A a;
public void methodA(){
do log;
a.methodA():
}
}
public class A{
public void methodA(){
b.methodB();
}
}
于是,当我们以为自己在调用A的methodA()方法时,实际调用的将是AP中的
methodA(),于是就可以把做日志的功能从原有的 methodA()中分离了出去。所以
,AOP要做的就是在用户不知道的情况下,将我们的调用点包裹了起来,从而把原
来的功能进行了分离。