每天一个(设计模式)-- Proxy模式

设模技式中,往往都是通过增加一个中间层,解决问题。

代理模式。本身就很清楚,代理就是要控制所代理的产品,或者是商品。那么对于面向对象来说,代理,就是要控制对象了。这种控制,不论是处于什么原因,事实就是,我们可能需要控制一些对象的行为,增加些行为调前的处理或者调用后的处理等等。

如果仅从方法上看,感觉更像是拦截器。拦截一个方法,从中加入一些我们需要的东西。这么一说,就比如,我们在调用对象行为的时候,希望能记录日志,但是不用每次都在调用之前去打印这些日志,那么我们就可以通过代理模式来完成。这也是AOP编程的思想。

下面我们来看看UML吧。
[img]http://dl.iteye.com/upload/attachment/0064/8900/ad427a31-137e-3a59-9740-d989b308dc4c.jpg[/img]
从图中可以看到,实际上就是两个实现相同接口的类,一个作为代理拥有另一个。这样把被代理的类对客户隐藏起来了。当然,通过接口,客户可以针对接口编程,具体的对象甚至是生成对象都由代理类来做,这样可以实现一些延迟加载,需要时加载的功能。

所以,一旦使用代理模式,那么一个对象的生死,行为可能都被代理类控制了。
当然,如果需要代理的类,拥有一个庞大的接口以及多种实现,那么我们可能比较痛苦了。这是我们可能就需要动态代理来实现了。JDK自带的动态代理类正好帮我解决了这个问题,Spring AOP 也正是使用这种技术。那么我们来看一看如何使用。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ListProxy implements InvocationHandler {
//the relSubject
private Object target;

public Object getTarget(){
return target;
}

private ListProxy(Object obj){
target = obj;
}
//here we create the proxy
public static Object getInstance(Object obj){
if(obj != null){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
new ListProxy(obj));
}
return null;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = null;

if(obj == null)
return null;

System.out.println("before processing list operation...");
result = method.invoke(target, args);
for(Object o:args){
System.out.println(o);
}

System.out.println("after processing list opertion...");
return result;
}

}


从上面的代码可以看到,动态代理使用的是反射技术。通过方式获取要代理的类以及要调用的方法。这种方法正式AOP使用的技术,(还有一个是使用CGLIB,CGLIB还可以代理类,JDK动态代理只能是针对接口,比如List)。

使用上面的代理类:

public class ProxyTtest {
public static void main(String args[]){
List<String> list = new ArrayList<String>();
@SuppressWarnings("unchecked")
List<String> lp = (List<String>)ListProxy.getInstance(list);
lp.add("this is main business!");
}
}



使用代理后,我们隐去了与业务核心无关的东西,比如日志记录,检查对象访问权限之类的事宜。是不是看起来很清爽呢?

结果:


before processing list operation...
this is main business!
after processing list opertion...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值