周末,带着老婆儿子一起逛公园。儿子一个人跑在前面,吧唧一下不小心摔了一跤,脑袋瓜子摔了个包,稀里哗啦的哭道:“爸爸,我会不会摔成傻子!”
我指了指我头上的伤痕安慰道:“不会的,你看,这是爸爸小时候摔的。”
话还没有说话,小家伙哭的更厉害了:“那就是说我长大后就会和你一样傻了,我不要,我不要!”
老婆忍不住发飙:“别哭了,你怎么会变傻呢?你看你爸,你爸傻吗?”
我赶紧回应道:“是啊,你看我多聪明!”
儿子:“真的,不骗我?”
老婆:“当然!”
儿子:“可是如果老爸不是傻子,当年怎么会娶你这个母老虎呢?”
我、老婆:……
什么是代理模式所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的左右。
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问,通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。说简单点,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。一般而言会分三种:静态代理、动态代理和CGLIB代理
代理模式结构如下:
静态代理静态代理需要代理对象和被代理对象实现一样的接口,我们来看个例子就清楚了
示例代理:static-proxy
代理类:UserDaoProxy.java
/** * 代理逻辑在代理类中,而不是由用户自定义 */ public class UserDaoProxy implements IUserDao { private IUserDao target; // 被代理对象 public UserDaoProxy(IUserDao target) { this.target = target; } /** * 前置/后置 处理一旦写完,就固定死了,后续想修改的话需要改此代理类 * @param id * @return */ public int delete(int id) { // 前置处理,例如开启事务 System.out.println("前置处理..."); // 调用目标对象方法 int count = target.delete(id); // 后置处理,例如提交事务或事务回滚 System.out.println("前置处理..."); return count; } }