A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

添加小知姐姐微信: csheima7 回复动态代理 获取完整版视频及笔记源码



# 动态代理深入挖掘

## 为什么要讲动态代理

1. 框架底层几乎离不开**反射**加**动态代理**,可见其重要性;
2. 我们大多数同学只是会用,不明白其核心原理,这就可能会导致你在使用的过程中出现问题而不明其所以然;
3. 出去面试我们要不要说点有深度的东西呢?当然要!不然企业凭什么选择你不选择别人;
4. 开启大家对于Java学习的新大门,领悟Java本身的乐趣,这才是长久在这个行业的生存之道。有一句话说的好:知之者不如好之者,好之者不如乐之者;

## 代理模式的优势

- **扫盲:什么是代理模式?**

  生活中的例子:房屋中介

  > 房主:我只想把我房子卖掉(**买卖双方交易**),200万,你把钱给我,我把房子过户到你名下;
  >
  > 中介:推广、带客户看房、准备合同、买卖双方签署合同、**买卖双方交易**、售后;
  >
  > 这里中介就是房主的代理,房主只是想把自己的房子卖掉,不需要关心其它的事情;
  >
  > 中介可以代理很多房主的房子,他们提供房屋销售的全套流程:售前、交易、售后;
  >
  > 需要注意的是,其中的**交易**是需要被代理者来完成的;
  >
  > 这个例子中,代理对象就是中介对象,被代理对象就是房主对象,代理对象自己无法完成**交易**流程,所以代理对象中需要有一个被代理对象作为其成员实例,以用来完成被代理的核心业务逻辑(**交易**);

  具体用代码描述

  ```java
  /**
   * Created By gao_e on 2020/3/16 10:22
   * 卖房子的人
   * 可以是房主,也可以是中介
   */
  public interface HouseSeller {
      // 卖房
      void sellHouse();
  }
  ```

  ```java
  /**
   * Created By gao_e on 2020/3/16 10:21
   * 房主
   */
  public class MasterOfHouse implements HouseSeller {
      private Integer howMuchW;
      public MasterOfHouse(Integer howMuchW) {
          this.howMuchW = howMuchW;
      }
      @Override
      public void sellHouse() {
          System.out.println("一口价"+this.howMuchW+"万");
          System.out.println("收钱");
          System.out.println("过户");
      }
  }
  ```

  ```java
  /**
   * Created By gao_e on 2020/3/16 10:27
   * 房屋中介
   */
  public class HouseAgent implements HouseSeller {
      private HouseSeller houseSeller;
      public HouseAgent(HouseSeller houseSeller) {
          this.houseSeller = houseSeller;
      }
      @Override
      public void sellHouse() {
          this.doSomethingOnBefore();
          this.houseSeller.sellHouse();
          this.doSomethingOnAfter();
      }
      private void doSomethingOnBefore() {
          System.out.println("售前...");
      }
      private void doSomethingOnAfter() {
          System.out.println("售后...");
      }
  }
  ```

  ```java
  /**
   * Created By gao_e on 2020/3/16 10:34
   * 卖房、买房流程
   */
  public class SellHouse {
      public static void main(String[] args) {
          System.out.println("一个房主将卖房事情委托给中介,中介针对这个房子会单独创建出一个中介(代理)对象");
          HouseSeller houseSeller = new HouseAgent(new MasterOfHouse(2000));
          System.out.println("中介将房子挂出来卖,买家来买房");
          houseSeller.sellHouse();
      }
  }
  ```

  结果如下

  ![image-20200316112735635](..\素材\image-20200316112735635.png)

......

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马