概述
代理模式的作用是:为其他对象提供一种以控制对方的访问。
在某种情况下,一个客户不想或者不能直接引用另一个对象可以在客户端和目标对象直接起到中介的作用。
代理的角色:
- 抽象角色,声明真实对象和代理对象的共同接口
- 代理角色,代理对象角色内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象,同时代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
- 真实角色,代理所代理的真实角色,是我们要引用的对象
静态代理
- 抽象角色
public interface HireHouse {
public void hire();
}
- 具体角色
public class HireHouseReal implements HireHouse{
public void hire(){
System.out.println("租房子");
}
}
- 代理角色
public class HireHouseProxy implements HireHouse{
private HireHouseReal hr;
public void hire(){
if(hr == null){
hr = new HireHouseReal();
System.out.println("收租金和中介费和押金");
hr.hire();
System.out.println("扣押金");
}
}
}
Jdk动态代理
jdk动态代理可以为所有带有接口实现类提供代理。
开发步骤
- 创建一个实现接口InvocationHandler的类,它必须实现invoke方法
- 创建被代理的类和接口
- 通过Proxy.newProxyInstance来创建代理类
- 通过代理调用
接口
public interface InterDemo {
//接口方法
public void dosomething();
}
接口实现类
public class InterDemoImpl implements InterDemo {
/**
* 方法实现类
*/
@Override
public void dosomething() {
System.out.println("doing");
}
}
动态代理实现类
public class DynamicProxyImpl implements InvocationHandler {
/**
* 被代理的对象
*/
private Object obj;
public DynamicProxyImpl(Object obj) {
super();
this.obj = obj;
}
/**
* 通过反射方式来调用被代理的方法
*/
@Override
public Object invoke(Object arg0, Method method, Object[] arg)throws Throwable {
System.out.println("前置工作");
Object result = method.invoke(obj, arg);
System.out.println("后置工作");
return result;
}
}
调用
public class Client {
public static void main(String[] args) {
//创建接口实现类
InterDemoImpl idi = new InterDemoImpl();
//创建代理的实现类
DynamicProxyImpl dp = new DynamicProxyImpl(idi);
//创建动态代理对象
InterDemo id = (InterDemo) Proxy.newProxyInstance(idi.getClass().getClassLoader(), idi.getClass().getInterfaces(), dp);
id.dosomething();
}
}