系列三十二、代理(二)静态代理

一、静态代理

1.1、概述

        静态代理是由程序员创建或者工具生成代理类的源码,再编译代理类。在程序运行前就已经存在代理类的字节码文件了,即代理类和被代理类的关系在运行前就确定了。

简单理解:在程序运行前,代理类就存在了,这就是静态代理;动态代理是程序运行时动态生成的。

1.2、实现步骤

(1)存在一个抽象角色 ;

(2)定义被代理角色;

(3)定义代理角色,增强被代理角色的功能;

二、案例代码

2.1、前置说明

以现实中经纪人代理明星为案例。 

2.2、pom


  
    junit
    junit
    4.13.2
  
  
  
    org.projectlombok
    lombok
    1.18.22
  
  
    org.slf4j
    slf4j-api
    1.7.32
  
  
    ch.qos.logback
    logback-classic
    1.2.10
  

 2.3、Star

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 23:31
 * @Description: 抽象角色
 */
public interface Star {
    /**
     * 唱歌
     * @param musicName 歌曲名字
     * @return
     */
    String sing(String musicName);

    /**
     * 跳舞
     */
    void dance();
}

2.4、SuperStar

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 23:32
 * @Description: 被代理角色
 */
@Data
public class SuperStar implements Star {

    /**
     * 歌手名字
     */
    private String starName;

    public SuperStar() {
    }

    public SuperStar(String starName) {
        this.starName = starName;
    }

    @Override
    public String sing(String musicName) {
        System.out.println(this.starName + "正在唱:" + musicName);
        return "谢谢!谢谢!";
    }

    @Override
    public void dance() {
        System.out.println(this.starName + "正在优美的跳舞");
    }
}

2.5、ProxyStar

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 23:35
 * @Description: 代理角色
 */
public class ProxyStar implements Star {
    private SuperStar superStar;

    public ProxyStar(SuperStar superStar) {
        this.superStar = superStar;
    }

    @Override
    public String sing(String musicName) {
        // 前增强
        System.out.println("准备话筒");

        String result = superStar.sing("奢香夫人");

        // 后增强
        System.out.println("收钱20万");

        return result;
    }

    @Override
    public void dance() {
        // 前增强
        System.out.println("准备场地");

        superStar.dance();

        // 后增强
        System.out.println("收款1000万");
    }
}

2.6、测试

@Slf4j
public class App {
    public static void main(String[] args) {

        SuperStar superStar = new SuperStar("杨超越");
        ProxyStar proxyStar = new ProxyStar(superStar);

        proxyStar.sing("奢香夫人");

        System.out.println("----------------");

        proxyStar.dance();

    }
}

系列三十二、代理(二)静态代理_第1张图片

你可能感兴趣的:(Spring全家桶面试系列,代理模式)