代理模式理解:
使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上。
代理模式 :静态代理 显式的指明了代理类和被代理类
1:创建提供代理的服务类接口
//方便真实对象实现 并重写,书写真实访问信息
interface NetWork { public void browse(); }
2:创建被代理类
//被代理类 实现服务接口
class RealServer implements NetWork { @Override public void browse() { System.out.println("真实服务器联网浏览网页"); } }
3:创建代理类
//代理类声明 服务接口类的属性 ,并重写服务接口的方法,添加被代理类实现不了的操作
class ProxyServer implements NetWork { private NetWork work; public ProxyServer(NetWork work) { this.work = work; } public void check() { System.out.println("检查网络连接是否通畅"); }
@Override public void browse() { check(); System.out.println("代理服务器代理真实服务器操作:"); work.browse(); } }
4:测试单元
public static void main(String[] args) { //创建被代理对象 NetWork work = new RealServer(); //实现代理 ProxyServer proxy = new ProxyServer(work); //调用被代理方法 proxy.browse(); }
静态代理的缺点:
①代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。
②同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。
代理模式 :动态代理 动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。
1:创建提供代理的服务类接口
//方便真实对象实现 并重写,书写真实访问信息
interface NetWork { public void browse(); }
2:创建被代理类
//被代理类 实现服务接口 class RealServer implements NetWork { @Override public void browse() { System.out.println("真实服务器联网浏览网页"); } }
3:创建代理类
class DynamicProxyHandler implements InvocationHandler { private Object object; public DynamicProxyHandler(final Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理浏览网页准备"); Object result = method.invoke(object, args); System.out.println("代理浏览网页后"); return result; } }
3:创建测试类
public static void main(String[] args) { NetWork work = new RealServer(); NetWork proxyServer = (NetWork)Proxy.newProxyInstance(NetWork.class.getClassLoader(),new Class[]{NetWork.class},new DynamicProxyHandler(work)); proxyServer.browse(); }