静态代理设计模式由于采用硬编码的形式,代理类不具备通用性,这样就会造成大量的重复代码,为了得到统一的代理支持,可以基于动态代理设计模式完成。
动态代理设计模式的最大特点是可以同时为若干个功能相近类提供统一的代理支持,但是需要定义一个公共的代理类。
需要使用到的接口和类
- java.lang.reflect.InvocationHandler
- java.lang.reflect.Proxy
1、实现动态代理设计模式的例子:
package com.mydemo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
IMessage iMessage = (IMessage) new MyProxy().bind(new MessageReal());
iMessage.send();
}
}
interface IMessage {
public void send();
}
class MessageReal implements IMessage {
@Override
public void send() {
System.out.println("【发送消息】------");
}
}
// 代理类
class MyProxy implements InvocationHandler {
// 真实业务对象
private Object target;
/**
* 进行真实业务对象与代理业务对象之间的绑定处理
*
* @param target 真实业务对象
* @return Proxy生成的代理业务对象
*/
public Object bind(Object target) {
// 保存真实对象
this.target = target;
// 依据真实对象的类加载、实现接口以及代理调用类(InvocationHandler)动态创建代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
/**
* 代理方法
*
* @return
*/
public boolean connect() {
System.out.println("【消息代理】进行消息发送通道的连接");
return true;
}
// 代理方法
public void close() {
System.out.println("【消息代理】关闭消息通道");
}
/**
* 方法覆写
*
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 真实业务处理结果
Object returnData = null;
// 通道是否连接
if (this.connect()) {
// 调用真实业务
returnData = method.invoke(this.target, args);
// 通道关闭
this.close();
}
// 返回执行结果
return returnData;
}
}
运行结果:
【消息代理】进行消息发送通道的连接
【发送消息】------
【消息代理】关闭消息通道