9.1.2 代理模式

代理模式(Proxy Pattern)是指建立在某一个对象的代理对象,并且由代理对象控制对象的引用。
例如,我们不能直接访问对象A,则可以建立对象A的代理对象A Proxy。这样可以通过访问A Proxy类间接地使用对象A的功能,A Proxy就像A的对外联络人一般,如下图
image.png

代理模式能够实现很多功能:

  • 隔离功能:通过建立一个目标对象的代理对象,可以防止外部对象对目标对象的直接访问,这样就使得目标对象与外部隔离。我们可以在代理对象中增加身份验证、权限验证等功能,从而实现目标对象的安全防护。
  • 扩展功能:对一个目标对象建立代理对象后,可以在代理对象中增加更多的扩展功能。
  • 直接替换:对一个目标对象建立代理对象后,可以直接使用代理对象完全替换目标对象,由代理对象来实现全部功能。例如,MyBatis中数据库操作只是一个抽象方法,但实际运行中会建立代理对象来完成数据库的读写操作。

9.1.3 静态代理

静态代理就是代理模式最简单的实现。所谓“静态”,是指被代理对象和dialing对象在程序中是确定的,不会在程序运行过程中发生变化。
例如,为用户设置一个接口类UserInterface,增加一个大招呼的抽象方法sayHello。

  1. public interface UserInterface {
  2. String sayHello(String name);
  3. }

实现UserInterface接口的被代理类如下

  1. public class User implements UserInterface {
  2. @Override
  3. public String sayHello(String name) {
  4. System.out.println("hello " + name);
  5. return "OK";
  6. }
  7. }
  1. 为代理类增加一个代理类。代理类中调用了被代理类的sayHello方法,并在此方法的基础上增加新功能。
  1. public class UserProxy implements UserInterface{
  2. private UserInterface target;
  3. public UserProxy(UserInterface target) {
  4. this.target = target;
  5. }
  6. @Override
  7. public String sayHello(String name) {
  8. System.out.println("pre words");
  9. target.sayHello(name);
  10. System.out.println("post words");
  11. return name;
  12. }
  13. }
  1. 使用代理对象中的方法
  1. public void testProxy() {
  2. //生成被代理对象
  3. User user = new User();
  4. //生成代理
  5. UserProxy userProxy = new UserProxy(user);
  6. //触发代理方法
  7. userProxy.sayHello("静态代理");
  8. }