代理模式
为什么要学习代理模式?
- 因为这就是SpringAOP的底层
代理模式分类:
- 静态代理
- 动态代理
10.1、静态代理
角色分析:
- 抽象角色:一般会使用接口或抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理对象的人
代码步骤:
- 接口
//租房
public interface Rent {
public void rent();
}
- 真实角色
//房东
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子!");
}
}
- 代理角色
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Proxy implements Rent{
private Host host;
@Override
public void rent() {
watchHouse();
host.rent();
contract();
fare();
}
//看房
public void watchHouse(){
System.out.println("中介带你看房");
}
//签合同
public void contract(){
System.out.println("签合同");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
}
- 客户端访问代理角色
public class Client {
public static void main(String[] args) {
//房东要租房子
Host host = new Host();
//找代理,中介帮房东租房子
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
代理模式优点:
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共业务也就交给了代理角色,实现了业务的分工
- 公共业务发生扩展的时候方便集中管理
代理模式缺点:
- 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低
10.2、动态代理
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是直接写好的
- 动态代理分为两大类:基于接口的动态代理、基于类的动态代理
- 基于接口:JDK动态代理
- 基于类:cglib
- Java字节码:Javassist
需要了解两个类:Proxy,InvocationHandler
动态代理的好处
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共业务也就交给了代理角色,实现了业务的分工
- 公共业务发生扩展的时候方便集中管理
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要实现了同一个接口即可