您的位置:首页 > 编程语言

代理模式之静态代理的简单实现---理解AOP(面向切面编程)的前奏---想要理解AOP,必须先理解一下

2016-10-09 16:28 746 查看
Aspect Oriented Programming  面向切面编程。

解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。

具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

(汉字就是这么绕,一会看代码的注释,就很详细的解释这句话)

AOP 主要是利用代理模式的技术来实现的。

先看类继承图:



target obj 还被代理类引用,即代理类内部有target obj的引用。图上忘记画了。

这样实现的好处是:本来需要target obj 去完成的事,现在可以让代理类来干。(隐藏了具体实现类,然后只能看到代理类。)

目标接口:后面2个对象都要实现这个接口,即面向接口编程思想

package lxk.aop;

/**
* 目标接口:
* 包含目标方法的声明
*/
public interface TargetInterface {
/**
* 目标方法
*/
void business();
}

目标对象类:实现目标接口

package lxk.aop;

/**
* 目标对象类实现目标接口.
* 继而实现目标方法。
*/
public class TargetObject implements TargetInterface {

/**
* 目标方法(即目标操作)
*/
@Override
public void business() {
System.out.println("business");
}

}

代理对象类:也实现目标接口,但是还包含目标对象的引用。

package lxk.aop;

/**
* 代理对象类也实现目标接口
* 继而实现目标方法。
*/
public class ProxyObject implements TargetInterface {

/**
* 面向接口编程,这个target其实指的是目标对象
* MainTest测试的时候,传入的就是目标接口的实现类的对象。
*/
private TargetInterface target;

/**
* 构造方法,代理对象得到真实的目标对象
* 即:给真实目标对象赋值
*/
public ProxyObject(TargetInterface target) {
this.target = target;
}

/**
* 在目标类的目标方法的上下文加一些内容
*
* 代理对象和真实对象的方法名是相同的,但是相对目标对象的目标方法,得到了扩展。
* 对外看来,使用方式是一致的,都调用同 一方法名。
* 类似生活中:
* 商店买的和直接厂家买的东西都是一样的。
* 厂家买:直接OK;
* 商店买:这个税,那个税,这个程序,那个程序。前前后后加了很多包装
* 只是经历的程序不一样,走的程序的多少的问题。代理一词来源于生活。
* 代理看似麻烦,但是却解决了很多问题。解耦,分工明确。
* 你不用到工厂去买你想要的东西。
* 工厂也不用管一些乱七八糟的东西。
*
* AOP:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。
* 具体看下示意图:注释不好整,就在下面截图啦。
*/
@Override
public void business() {
System.out.println("aaaaa");//切面方法a();
//。。。
this.target.business();//目标类的目标方法(横向业务流:对应示意图的5();)
//。。。
System.out.println("bbbbb");//切面方法f();
}

}


测试类:

package lxk.aop;

public class MainTest {
public static void main(String[] args) {
//横向业务流:方法1();
//。。。
TargetInterface proxy = new ProxyObject(new TargetObject());
proxy.business();//代理对象来代理目标对象,执行目标方法。
//。。。
//横向业务流:方法7();
}
}


然后就是,AOP的示意图:



以上就是静态代理的简单实现:

不好的地方就是静态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐