结构型模式——代理复习

定义:给一个对象提供一个代理对象,由这个代理对象控制原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用

当系统需要对某个对象进行额外控制时,就需要使用代理模式,比如日志,权限,事务处理,异常处理等和业务系统关系不大的额外控制。

在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"); } }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值