代理模式是指客户端通过代理对象访问实际对象的设计模式。通常我们在处理同一种类型的服务,这个服务的大部分都是相同的,只是在具体的细节上存在差异。这种情况为了避免重复处理相同的服务部分,我们就可以将具体实现细节抽象出来,通过代理实现,在整体结构上种类繁多的服务看起来如同只有一个服务,区别只是在于服务具体的细节不一样。
Java提供三种方式实现动态代理:JDK代理,CGLIB和通过编译期提供的API动态创建代理类。
1.JDK代理通过实现InvocationHandler被代理对象必须实现接口
2.CGLIB代理类实际是被代理类的一个子类,被代理对象必须可以被继承(不能有final之类的声明)
3.通过编译期提供的API动态创建代理类,需要定义被代理对象
这里贴一个个JDK代理实现的简单示例供参考:
1.被代理接口
public interface BusinessProcesser {
/**
* 功能描述:消息执行
* @param message
* @return
*/
public void execute();
}
2.被代理实现
public class HttpGetProcesser implements BusinessProcesser{
@Override
public void execute() {
System.out.println("this is HttpGetProcesser");
}
}
3.代理实现
public class ProcesserProxy implements InvocationHandler {
Object obj;
public Object getProxy(Object obj)
{
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
doBefore();
Object res = method.invoke(obj, args);
doAfter();
return res;
}
private void doBefore() {
System.out.println("[Proxy]一些前置处理");
}
private void doAfter() {
System.out.println("[Proxy]一些后置处理");
}
}
4.调用方式
public class ProcesserTest {
/**
* @param args
*/
public static void main(String[] args) {
BusinessProcesser bp = new HttpGetProcesser();
ProcesserProxy invocationProxy = new ProcesserProxy();
BusinessProcesser proxyProcesser = (BusinessProcesser) invocationProxy.getProxy(bp);
proxyProcesser.execute();
}
}
实战代码较多,后续补上。
的java代码字符串。