代理模式
爲什麼要學習代理模式,因爲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();
}
}
分析: 在這個過程中,你直接接觸的就是中介,就如同現實生活中的樣子,你看不到房東,但是你依舊租到了房東的房子通過代理,這就是所謂的代理模式。
靜態代理的好處
- 可以使得真實角色更加的純粹,不再去關注一件事情核心部分之外的公共事情
- 公共的事情可以交給代理去處理,實現了業務的分工
- 公共業務發生擴展時變得更加集中和方便
靜態代理的缺點:
- 真實角色越多,代理角色就越多,需要寫的類更多了,開發效率降低
如果我們既要享受靜態代理的好處,又要避免動態代理的缺點,就出現了動態代理!