代理模式定义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
角色:
1、抽象角色:声明真实对象和代理对象的共同接口。
2、代理角色:代理对象角色内部含有真实对象的引用,从而可以替代真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
3、真实角色:代理角色所代表的真实对象,使我们最终要引用的对象。
分类:
分为静态代理和动态代理,下面介绍静态代理,动态代理在下一篇文章介绍。
静态代理也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
示例:
代码结构:
/** * 抽象角色,真实对象和代理对象共同的接口 * * @author Administrator * */ public interface UserInfo { public void queryUser(); public void updateUser(); }
/** * 真实角色 * * @author Administrator * */ public class UserImpl implements UserInfo { @Override public void queryUser() { System.out.println("真实对象查询方法"); } @Override public void updateUser() { System.out.println("真实对象修改方法"); } }
/** * 代理角色 * * @author Administrator * */ public class UserProxy implements UserInfo { private UserInfo userImpl; public UserProxy(UserInfo userImpl) { this.userImpl = userImpl; } @Override public void queryUser() { System.out.println("在查询之前扩展需要执行的方法"); } @Override public void updateUser() { System.out.println("在修改之前扩展需要执行的方法"); } }
/** * 测试类 * @author Administrator * */ public class Test { public static void main(String[] args) { /** * 使用代理对象 */ UserInfo userImpl = new UserImpl(); userImpl.queryUser(); userImpl.updateUser(); /** * 使用代理对象 */ UserInfo userProxy = new UserProxy(userImpl); userProxy.queryUser(); userProxy.updateUser(); } }
使用代理对象调用代理对象的方法;
使用真实对象调用调用真实对象的方法;