GOF定义:为其他对象提供一种代理以控制该对象的访问。
代理模式是一种非常有用的模式,它存在的变种模式比较多。比如:远程代理、虚拟代理、保护代理、智能引用、动态代理等等。
package proxy; /** *create by datao.wang 2014-3-1-下午2:56:30 */ public interface Subject { //被代理方法 public void beat(); } package proxy; /** *create by datao.wang 2014-3-1-下午2:57:56 */ public class RealSubject implements Subject { @Override public void beat() { System.out.println("我才是幕后的黑手"); } } package proxy; /** *create by datao.wang 2014-3-1-下午2:58:28 */ public class Proxy implements Subject { private RealSubject real; public Proxy(){ this.real=new RealSubject();; } @Override public void beat() { System.out.println("我只是一个代理打手!"); real.beat(); } } package proxy; /** *create by datao.wang 2014-3-1-下午2:58:53 */ public class Client { public static void main(String[] args) { Subject proxy=new Proxy(); proxy.beat(); } }
例如果我们要访问正在另一台计算机上运行对象的方法,我就会设法和该计算机进行通信,而不能像本地直接调用对象一样。所以我们就会设计一些通信并且调用对象的方案,如:CORBA、java RMI(remote method invocation)都已经实现了这样的方案。
动态代理的实现: 通过反射生成的代理对象
public class TraceHandler implements InvocationHandler { //实现的代理处理器 private Object target; public TraceHandler(Object t){ this.target=t; } /** * @param proxy 代理的对象 * @param method 代理的方法 * @param args 传入参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { return method.invoke(target, args); } } public static void main(String[] args) { Object[] elements=new Object[1000]; for(int i=0;i<elements.length;i++){ Integer value=i+1; // Integer 是被代理对象 InvocationHandler handler= new TraceHandler(value);//代理处理器 Object proxy=Proxy.newProxyInstance(null, new Class[]{Comparable.class}, handler);//代理,生成代理 这里代理的是Integer类实现的Comparable接口实现的方法 elements[i]=proxy; } Integer key=new Random().nextInt(elements.length)+1; int result=Arrays.binarySearch(elements, key);//二分法查找,对比与key相同的int值。 if(result>=0){ System.out.println(elements[0]); } }
代理的缺点:
1、代理要生成一个代理对象,所以运行速度会变慢
2、有些代理对象实现复杂
代理使用的场景:
涉及对象权限的访问,如在android中要想使用系统未开放api的功能,就得去调用系统源码,但是系统源码调用又有权限(如protected,private 声明的),此时就可以直接使用反射或动态代理。
相关推荐
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
JAVA设计模式之代理模式实例
代理模式.ppt代理模式.ppt代理模式.ppt
本程序是一个代理模式的小例子。程序比较简单。
深信服网闸代理模式配置教程
设计模式-代理模式(讲解及其实现代码)
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式
代理模式代理模式代理模式
自己总结的代理模式和Java中的动态代理模式,有源码
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的主要作用是,用来控制真实对象的访问权限,也就是完全对外隐藏真实对象。以及在调用真实对象时,代理还可以额外的处理另外的事。 比如下面...
代理模式的小demo
自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
该资源提供了三种代理模式的使用代码,其中包含每种模式的jar包、具体代码、Demo测试类,详细的注释帮助你来理解。
设计模式C++学习之代理模式(Proxy)
.net实现设计模式之代理模式