一、静态代理
1.1、概述
静态代理是由程序员创建或者工具生成代理类的源码,再编译代理类。在程序运行前就已经存在代理类的字节码文件了,即代理类和被代理类的关系在运行前就确定了。
简单理解:在程序运行前,代理类就存在了,这就是静态代理;动态代理是程序运行时动态生成的。
1.2、实现步骤
(1)存在一个抽象角色 ;
(2)定义被代理角色;
(3)定义代理角色,增强被代理角色的功能;
二、案例代码
2.1、前置说明
以现实中经纪人代理明星为案例。
2.2、pom
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- 普通maven项目中使用Sl4j注解 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.10</version>
</dependency>
</dependencies>
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();
}
}