設計模式
一、代理模式概述
代理模式是Java開發中使用較多的一種設計模式。代理設計就是爲其
他對象提供一種代理以控制對這個對象的訪問。
二、代碼實例
接口的應用:代理模式
【類似:想要租房子 & 中介;明星 & 經紀人】
1. 爲什麼非要代理類來做?
因爲代理類中不光做這個事,還做了些別的事,而被代理類只關注自己核心到底是要幹什麼就可以了
【如下代碼就能看到,真正的明星類只關注自己的核心功能"唱歌"就可以了,其他的都由代理類來完成】
2. 靜態代理
- 這裏寫的是靜態代理(代理類是專門針對某一個接口的);
- 後期講到框架會用到代理模式,但是是動態代理(代理類這次是代理租房子,下次是代理買菜…,究竟代理誰,是運行過程中動態分配的),需要用到反射的知識;
//測試
public class StaticProxyTest {
public static void main(String[] args) {
RealStar real = new RealStar();
Proxy p = new Proxy(real);
p.confer();
p.signContract();
p.bookTicket();
p.sing();
p.collectMoney();
}
}
/**
* 接口
*/
interface Star{
void confer(); //面談
void signContract(); //籤合同
void bookTicket(); //訂票
void sing(); //唱歌
void collectMoney(); //收錢
}
/**
* 真正的明星類【實際上只關注自己的核心功能:"唱歌";其他功能不關注】
*/
class RealStar implements Star{
@Override
public void confer() {}
@Override
public void signContract() {}
@Override
public void bookTicket() {}
@Override
public void sing() {
System.out.println("明星,唱歌~~~");
}
@Override
public void collectMoney() {}
}
/**
* 代理類
* 【除了明星的核心功能"唱歌",其他都由代理類來完成即可;】
* 【需要"唱歌"的時候,調用真正的明星類來完成】
*/
class Proxy implements Star{
private RealStar real;
//創建代理類的時候,指明被代理的對象
public Proxy(RealStar real){
this.real = real;
}
@Override
public void confer() {
System.out.println("經紀人面談");
}
@Override
public void signContract() {
System.out.println("經紀人籤合同");
}
@Override
public void bookTicket() {
System.out.println("經紀人訂票");
}
@Override
public void sing() {
real.sing(); //唱歌則調用被代理類來完成
}
@Override
public void collectMoney() {
System.out.println("經紀人收錢");
}
}
三、代理模式的應用場景
- 安全代理:屏蔽對真實角色的直接訪問;
- 遠程代理:通過代理類處理遠程方法調用(RMI);
- 延遲加載:先加載輕量級的代理對象,真正需要再加載真實對象;
【比如你要開發一個大文檔查看軟件,大文檔中有大的圖片,有可能一個圖片有100MB,在打開文件時,不可能將所有的圖片都顯示出來,這樣就可以使用代理模式,當需要查看圖片時,用proxy來進行大圖片的打開。】