代理模式的作用是控制和管理訪问
转载请说明出处:http://blog.csdn.net/dawanganban
先看一段代码:
package com.test; /** * 抽象角色 * @author Administrator * */ abstract public class Subject { abstract public void request(); }
package com.test; /** * 真实角色 * @author 阳光小强 * */ public class RealSubject extends Subject{ public RealSubject(){ } public void request(){ System.out.println("From real subject"); } }
package com.test; /** * client调用 * @author 阳光小强 * */ public class Main { public static void main(String[] args) { Subject sub = new RealSubject(); sub.request(); } }上面代码应该非常easy看懂。以下我们使用代理模式(新增一个ProxySubject类)
package com.test; /** * * @author 阳光小强 * */ public class ProxySubject extends Subject{ private RealSubject realSubject; //以真实角色作为代理角色的属性 public ProxySubject(){ } @Override public void request() { preRequest(); if(realSubject == null){ realSubject = new RealSubject(); } realSubject.request(); postRequest(); } private void preRequest(){ //something you want to do before requesting } private void postRequest(){ //something you want to do after requesting } }
客户实际须要调用的是RealSubject类的request()方法,如今用ProxySubject来代理RealSubject类。相同达到目的。同一时候还封装了其它方法(preRequest(),postRequest())。能够处理一些其它问题。
有时候我们须要代理的对象不确定,所以就须要动态代理,Java中的动态代理模式实现例如以下:
package com.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicSubject implements InvocationHandler { private Object dele; public DynamicSubject(Object obj) { this.dele = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { doBefore(); //在这里全然能够把以下这句凝视掉。而做一些其它的事情 Object result = method.invoke(dele, args); after(); return result; } private void doBefore() { System.out.println("before...."); } private void after() { System.out.println("after...."); } }
package com.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * client调用 * @author 阳光小强 * */ public class Main { public static void main(String[] args) throws Exception { RealSubject rs = new RealSubject(); //被代理的类 InvocationHandler ds = new DynamicSubject(rs); //初始化代理类 Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), ds); subject.request(); } }