代理Proxy:
Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。
更通俗的说,代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代理真正调用的还是委托类的方法。
使用场合举例:
如果需要委托类处理某一业务,那么我们就可以先在代理类中统一处理然后在调用具体实现类
按照代理的创建时期,代理类可以分为两种:
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态:在程序运行时运用反射机制动态创建而成。
下面分别用静态代理与动态代理演示一个示例:
添加打印日志的功能,即每个方法调用之前和调用之后写入日志
静态代理:
具体用户管理实现类
public class UserManagerImpl implements UserManager { @Override public void addUser(String userId, String userName) { System.out.println("UserManagerImpl.addUser"); } @Override public void delUser(String userId) { System.out.println("UserManagerImpl.delUser"); } @Override public String findUser(String userId) { System.out.println("UserManagerImpl.findUser"); return "张三"; } @Override public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl.modifyUser"); } }
代理类–代理用户管理实现类
public class UserManagerImplProxy implements UserManager { // 目标对象 private UserManager userManager; // 通过构造方法传入目标对象 public UserManagerImplProxy(UserManager userManager){ this.userManager=userManager; } @Override public void addUser(String userId, String userName) { try{ //添加打印日志的功能 //开始添加用户 System.out.println("start-->addUser()"); userManager.addUser(userId, userName); //添加用户成功 System.out.println("success-->addUser()"); }catch(Exception e){ //添加用户失败 System.out.println("error-->addUser()"); } } @Override public void delUser(String userId) { userManager.delUser(userId); } @Override public String findUser(String userId) { userManager.findUser(userId); return "张三"; } @Override public void modifyUser(String userId, String userName) { userManager.modifyUser(userId,userName); } }
客户端调用
public class Client { public static void main(String[] args){ //UserManager userManager=new UserManagerImpl(); UserManager userManager=new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("1111", "张三"); } }