定义:给一个对象提供一个代理对象,由这个代理对象控制原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用
当系统需要对某个对象进行额外控制时,就需要使用代理模式,比如日志,权限,事务处理,异常处理等和业务系统关系不大的额外控制。
在Spring AOP和Hibernate延迟加载都有使用。
静态代理示例:
/** Test.java */ public interface Test{ //有关业务逻辑的相关程序 public void doLogic(String name); } /** TestImpl.java */ public class TestImpl implements Test{ //有关业务逻辑处理相关程序 public void doLogic(String name){ //业务逻辑 } } /** TestProxy.java */ public class TestProxy implements Test{ private Logger logger = Logger.getLogger(this.getClass().getName()); private Test test; //在该类中针对前面的接口Test编程,而不针对具体的类 public TestProxy(Test test){ this.test = test; } //有关业务逻辑的相关程序 public void doLogic(String name){ logger.log(name + "开始业务逻辑处理..."); test.doLogic(name); logger.log(name + "业务逻辑处理结束..."); } } /** Client.java */ public class Client{ public static void main(String[] args){ TestProxy testProxy = new TestProxy(new TestImpl()); testProxy.doLogic("username"); } }
动态代理示例:
业务逻辑处理接口和实现类同静态代理
/** LogProxy.java */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //代理类实现了接口InvocationHandler public class LogProxy implements InvocationHandler{ private Logger logger = Logger.getLogger(this.getClass().getName()); private Object delegate; //绑定代理对象 public Object bind(Object delegate){ this.delegate = delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces,this); } //针对接口编程 public Object invoke(Object proxy, Method method, Object[] args){} throws Throwable{ Object result = null; try{ //在方法调用前后进行日志输出 logger.log(args[0] + "开始业务逻辑处理"); result = method.invoke(delegate, args); logger.log(args[0] + "业务逻辑处理结束"); }catch(Exception e){ logger.log(e.toString()); } return result; } } /** Client.java */ public class Client{ public static void main(String[] args){ LogProxy logProxy = new LogProxy(); Test test = (Test)logProxy.bind(new TestImpl()); testProxy.doLogic("username"); } }
1052

被折叠的 条评论
为什么被折叠?



