代理模式
为什么要学习代理模式,因为AOP的底层就是动态代理
代理模式
- 静态代理
- 动态代理
学习AOP之前了解一下代理模式
静态代理
静态搭理的角色分析
- 抽象角色:一般使用接口和抽象类来定义(真实角色和代理角色要做的事情)
- 真实角色:被代理的角色(事情的幕后操控者)
- 代理角色:代理真实角色的角色(给幕后操作者跑腿的人)同时还会做一些自己的事情
- 客户:使用代理角色进行一些操作(与跑腿的打交道的人)
代码实现
抽象角色
public interface Rent {
/**
* 抽象角色--真实角色和代理角色需要共同去完成的事情
*/
public void rent();
}
真实角色
public class Host implements Rent {
/**
* 真实角色要去完成的事情
*/
@Override
public void rent() {
System.out.println("房东要出租房屋");
}
}
代理角色
public class Proxy implements Rent{
/**
* 中介(代理角色)背后的老板(真实角色)
*/
private Host host;
/**
* 中介(代理角色)要和老板产(真实角色)生关系
* @param host
*/
public Proxy(Host host) {
this.host = host;
}
/**
* 代理角色要去完成的事情
*/
@Override
public void rent(){
/**
* 中介(代理角色)要去完成的老板(真实角色)要完成的事情
*/
host.rent();
/**
* 中介(代理角色)去完成老板(真实角色)没有要求的附带操作
*/
seeHouse();
hetong();
}
/**
* 中介(代理角色)除了完成老板(真实角色)交代的事情以外
* 自己还要去做的附加操作
*/
public void seeHouse(){
System.out.println("中介带客户看房子");
}
public void hetong(){
System.out.println("中介代替老板和客户签合同");
}
}
客户
public class Client {
public static void main(String[] args) {
/**
* 创建真实角色
*/
Host host=new Host();
/**
* 创建代理角色
*/
Proxy proxy=new Proxy(host);
/**
* 客户通过中介(代理角色)去做老板(真实角色)要做的事情-出租房子(抽象角色)
*/
proxy.rent();
}
}
分析: 在这个过程中,你直接接触的就是中介,就如同现实生活中的样子,你看不到房东,但是你依旧租到了房东的房子通过代理,这就是所谓的代理模式。
静态代理的好处
- 可以使得真实角色更加的纯粹,不再去关注一件事情核心部分之外的公共事情
- 公共的事情可以交给代理去处理,实现了业务的分工
- 公共业务发生扩展时变得更加集中和方便
静态代理的缺点:
- 真实角色越多,代理角色就越多,需要写的类更多了,开发效率降低
如果我们既要享受静态代理的好处,又要避免动态代理的缺点,就出现了动态代理!