设计模式--代理模式

  1. 代理模式就是给一个对象提供了一个代理对象,并由代理对象控制对原对象的引用

  2. 起到了一个中介的作用,它连接客户端和目标对象

  3. 代理模式的UML图

  4. subject:抽象角色,声明真实对象和代理对象的共同接口。proxy:代理角色,代理对象与真实对象实现相同的接口,所以它在任何时刻都能够代理真实对象,内部包含对真实对象的引用。realsubject真实角色,代表着真实的对象。

  5. 按照代理创建的时期进行分类,代理模式分为静态代理和动态代理:

    1. 静态代理

      ​ 是有程序员创建或者特定工具自动生成源代码,再对其进行编译。在代码运行之前,代理类.class文件就已经被创建好了。需要为每个类都创建一个代理类,不易管理。

    2. 动态代理

      ​ 在程序运行时通过反射机制动态创建的。大大加少了开发任务,同时加少了对业务接口的依赖,降低了耦合度。

  6. 静态代理的代码实现过程

    1. 创建一个抽象角色

      /**
       * 抽象角色
       */
      public interface BuyHouse {
          void buyHouse();
      }
      
    2. 创建具体角色

      /**
       * 真实的具体角色
       */
      public class RealBuyHouseSubject implements BuyHouse {
          @Override
          public void buyHouse() {
              System.out.println("我要买房!");
          }
      }
      
    3. 创建静态代理类(与具体角色实现相同的接口)

      /**
       * 静态代理角色
       */
      public class BuyHouseProxy implements BuyHouse {
      
          //真实对象的引用
          BuyHouse buyHouse;
      
          BuyHouseProxy(BuyHouse buyHouse){
              this.buyHouse = buyHouse;
          }
      
          /**
           * 静态代理过程
           */
          @Override
          public void buyHouse() {
              buyHouse.buyHouse();
              System.out.println("选择房源");
              System.out.println("谈价钱");
              System.out.println("支付购房款");
          }
      }
      
    4. 编写静态代理测试类

      public class StaticTest {
          public static void main(String[] args) {
              BuyHouseProxy buyHouseProxy = new BuyHouseProxy(new RealBuyHouseSubject());
              buyHouseProxy.buyHouse();
          }
      }
      
  7. 动态代理的代码实现

    1. 创建一个抽象角色

      /**
       * 抽象角色
       */
      public interface BuyHouse {
          void buyHouse();
      }
      
    2. 创建一个抽象角色的实现类(具体角色)

      /**
       * 真实的具体角色
       */
      public class RealBuyHouseSubject implements BuyHouse {
          @Override
          public void buyHouse() {
              System.out.println("我要买房!");
          }
      }
      
    3. 创建动态代理类

      import java.lang.reflect.InvocationHandler;
      import java.lang.reflect.Method;
      
      /**
       *  1. 与静台代理类的不同之处:实现的接口不一样
       *  2. 通过客户端的调用,可以将InvocationHandler反射称为BuyHouse接口
       *  3. 通过反射机制进行代理类的创建,在客户端调用的时候才创建(在程序运行过程中动态代理)
       *  4. 动态代理类能够代理多种类型的类
       */
      public class DynamicBuyHouseProxy implements InvocationHandler {
      
          //代理类需要关联真实的角色类
          Object object;
      
          public DynamicBuyHouseProxy(Object object) {
              this.object = object;
          }
      
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              //通过反射调用具体的方法
              //object调用具体的代理类
              Object result = method.invoke(object, args);
              System.out.println("选择房源");
              System.out.println("谈价钱");
              System.out.println("支付购房款");
              return result;
          }
      
      }
      
    4. 编写测试类

      import com.kangswx.designmode.structure.proxy.BuyHouse;
      import com.kangswx.designmode.structure.proxy.RealBuyHouseSubject;
      
      import java.lang.reflect.Proxy;
      
      public class DynamicProxyTest {
          public static void main(String[] args) {
              BuyHouse buyHouse = new RealBuyHouseSubject();
              BuyHouse proxy = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(),
                      new Class[]{BuyHouse.class},
                      new DynamicBuyHouseProxy(buyHouse));
              proxy.buyHouse();
          }
      }
      
  8. 代理模式的优点

    1. 代理模式能够协调调用者与被调用者,降低了系统的耦合度
    2. 代理对象可以在客户端和目标对象之间起到中介的作用,起到了保护对象的作用。
  9. 代理模式的缺点

    1. 在客户端和真实对象之间增加了代理类,有些类型的代理模式可能会造成请求的处理速度变慢。
    2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
  10. 代理模式的适用场景

  11. 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。

  12. 虚拟代理:通过一个小的对象代理一个大的对象,减少系统的开销。

  13. 保护代理:用来控制对真实对象的访问权限。

  14. 代理模式在JDK中的使用

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值