3.2 JAVA静态代理

133 阅读1分钟

静态代理

真实对象和代理对象都要实现同一个接口

代理对象要代理真实对象

代理对象可以做很多真实对象做不了的事情

真实对象专注于自己的事情

1. 婚礼示例

  • 你:真实角色
  • 婚庆公司:代理你,帮你处理结婚的各种事情
  • 结婚:实现结婚接口
 /**
  * @ClassName Demo1
  * @Description 静态代理:结婚示例
  * @Author wangwk-a
  * @Date 2022/1/1 19:15
  * @Version 1.0
  */
 public class Demo1 {
     public static void main(String[] args) {
         WeddingCompany weddingCompany = new WeddingCompany(new You());
         // 婚庆公司调用结婚方法,但是真实结婚的对象是“我”
         weddingCompany.happyMarry();
     }
 }
 ​
 /**
  * 公共接口
  */
 interface Marry {
     /**
      * 结婚接口,真实角色和代理角色都要继承该接口
      */
     void happyMarry();
 }
 ​
 /**
  * 真实角色实现公共接口
  */
 class You implements Marry {
     @Override
     public void happyMarry() {
         System.out.println("我要结婚啦");
     }
 }
 ​
 /**
  * 代理对象实现公共接口
  */
 class WeddingCompany implements Marry {
     /**
      * 代理对象要通过参数来获取真实对象
      */
     private Marry target;
     public WeddingCompany(Marry target) {
         this.target = target;
     }
 ​
     /**
      * 代理对象要调用真实对象的方法
      * 同时可以在其前后做很多别的事情
      */
     @Override
     public void happyMarry() {
         beforeMarry();
         this.target.happyMarry();
         afterMarry();
     }
 ​
     private void afterMarry() {
         System.out.println("婚后收尾款");
     }
 ​
     private void beforeMarry() {
         System.out.println("婚前布置婚礼现场");
     }
 }
 婚前布置婚礼现场
 我要结婚啦
 婚后收尾款
 ​
 Process finished with exit code 0

2. Runnable接口使用与静态代理

使用实现Runnable接口来进行多线程的方式时,需要编写一个自己的线程类实现Runnable接口:

image.png

在调用的时候,需要通过Thread类来调用:

image.png

实际上,Thread类就是一个代理类,它也实现了Runnable接口:

image.png

这样的话,我们自己写的线程类就是真实角色,Thread代理角色通过构造函数来代理真实角色:

image.png