定义
为其他对象提供一种代理以控制对这个对象的访问。在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,或者想在访问一个类时做一些控制,返回前后做一些事情都是可以,我们可以在访问此对象时加上一个对此对象的访问层,
举个例子
有个人想打官司 ,他可以自己打官司也可以请律师帮忙打官司,律师就是他们的代理人
定义一个接口来定行为
public interface ILawsuit {
//提交举证
boolean submit();
//进行举证
boolean burden();
//开始辩护
boolean defend();
//诉讼完成
boolean finish();
}
小明去打官司
public class xiaoming implements ILawsuit {
@Override
public boolean submit() {
System.out.println("开始提交");
return true;
}
@Override
public boolean burden() {
System.out.println("开始举证");
return true;
}
@Override
public boolean defend() {
System.out.println("开始辩护");
return true;
}
@Override
public boolean finish() {
System.out.println("结束");
return true;
}
}
代理律师 帮助小明打官司 ,只需要小明传入材料
public class StaticProxy implements ILawsuit {
private ILawsuit mILawsuit;
StaticProxy(ILawsuit iLawsuit) {
mILawsuit = iLawsuit;
}
@Override
public boolean submit() {
return mILawsuit.submit();
}
@Override
public boolean burden() {
return mILawsuit.burden();
}
@Override
public boolean defend() {
return mILawsuit.defend();
}
@Override
public boolean finish() {
return mILawsuit.finish();
}
}
代理关系建立
xiaoming xiaoming1 = new xiaoming();
StaticProxy staticProxy = new StaticProxy(xiaoming1);
staticProxy.burden();
staticProxy.defend();
staticProxy.finish();
staticProxy.submit();
上面使用到的是静态代理
我更喜欢动态代理,因为动态代理可以动态帮所有人做任何事情,你也可以在invoke方法做事情的时候添加你想做的事情
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object object) {
obj = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始执行"+method.getName());
Object result = method.invoke(obj, args);
System.out.println(result);
System.out.println("结束执行"+method.getName());
return result;
}
}
通过动态代理就可以拿到代理接口的代理类 做到一个动态代理的效果
DynamicProxy dynamicProxy = new DynamicProxy(xiaoming);
ClassLoader classLoader = xiaoming.getClass().getClassLoader();
ILawsuit lawsuit = (ILawsuit) Proxy.newProxyInstance(classLoader, new Class[]{ILawsuit.class}, dynamicProxy);
lawsuit.submit();
lawsuit.burden();
lawsuit.defend();
lawsuit.finish();
优缺点
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢