代理模式
- 解决问题
- 将次要业务和主要业务做解耦合处理
- 次要业务和主要业务的区分:
- 次要业务: 起到辅助功能: 辅助主要业务顺利执行, 在业务中往往大量重复出现
- 次要业务对开发效率影响:
- 加载驱动
- 建立连接
- 建立数据库操作对象
- 推送sql命令到数据库执行并返回处理结果
- 销毁connection,statement,result
- 代理模式的本质: 行为监听
- 代理模式组成:
- 声明需要被监听行为
- 代理实现类(InvocationHandler): 次要业务和主要业务绑定执行
- 代理对象(监听对象)
一个简单例子
public interface StudentService {
void study();
}
public class Student implements StudentService{
@Override
public void study(){
System.out.println(" study...");
}
}
public class AgentUtil <T> implements InvocationHandler {
private T object;
public AgentUtil bind(T object) {
this.object = object;
return this;
}
public StudentService register() {
/**
* 实例类的所有接口 如果指定拦截某一个接口 用{StudentService.class}
*/
Class classArray[] = object.getClass().getInterfaces();
/**
* loader: 指向被监控的类文件在内存中的真实地址
* interface: 被监控的类所实现的接口, 这个接口中所声明的方法,就是需要被被监控行为 也是主要行为名称
* h: 被监测的方法调用时 会执行实现了invocationHandler类的invoke方法
*/
return (StudentService)Proxy.newProxyInstance(object.getClass().getClassLoader(), classArray, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
method.invoke(object, args);
System.out.println("after");
return null;
}
}
public class App
{
public static void main( String[] args )
{
Student s = new Student();
StudentService agent = new AgentUtil().bind(s).register();
// agent 实际是一个AgentUtil的动态代理 是一个实现类InvocationHandler的类,其中包含被代理对象 s
agent.study();
}
}
总结
- 代理流程
- 绑定代理对象
new AgentUtil().bind();
- 注册实例到代理获取代理对象
Proxy.newProxyInstance(object.getClass().getClassLoader(), classArray, this);
- 执行代理对象对应的方法
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); method.invoke(object, args); System.out.println("after"); return null; }
- 绑定代理对象
来源:oschina
链接:https://my.oschina.net/osmoon/blog/3164961