設計模式(8)----代理模式
- 簡介
- 理模式在Java中十分常見,有為擴展某些類的功能而使用靜態代理,也有如Spring實現AOP而使用動態代理,更有RPC實現中使用的調用端調用的代理服務。
- 定義
- 為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
- 組成
- ISubject:抽象主題角色,是一個接口。該接口是對象和它的代理共用的接口。
- RealSubject:真實主題角色,是實現抽象主題接口的類。
- Proxy:代理角色,內部含有對真實對象RealSubject的引用,從而可以操作真實對象。代理對象提供與真實對象相同的接口,以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
- 步驟
- 創建一個抽象對象接口:
- 創建一個抽象對象接口:
package com.lvsling.proxy;
public interface Star {
void movieShow(int money);
} |
- 創建真實對象接口
package com.lvsling.proxy;
public class MovieStar implements Star {
public
void System.out.println("movie star movie show, pay: " + money); }
} |
- 創建代理對象類
package com.lvsling.proxy;
public class MovieStarProxy implements Star { private Star star;
public this.star = star; }
/* 代理movie show condition */ public void movieShow(int money) { if (money > 10000) { star.movieShow(money); } else { System.out.println("Movie star does not take movie show witch noney less than 10000"); } }
} |
- 客戶端調用代理對象
package com.lvsling.proxy;
public class Client { public static void main(String[] args) { MovieStar movieStar = new MovieStar(); //直接調用真實對象 movieStar.movieShow(10000); Star movieStarProxy = new MovieStarProxy(movieStar); //調用代理對象 movieStarProxy.movieShow(10000); movieStarProxy.movieShow(20000);
}
} |
- 控制臺打印輸出
movie star movie show, pay: 10000 Movie star does not take movie show witch noney less than 10000 movie star movie show, pay: 20000 |
- 優點
- 代理模式能將代理對象與真正被調用的對象分離,在一定程度上降低了系統的耦合度。
- 代理模式在客戶端和目標對象之間起到一個中介作用,這樣可以起到保護目標對象的作用。代理對象也可以對目標對象調用之前進行其他操作。
- 缺點
- 在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢。
- 增加了系統的復雜度。
- 應用場景
- 遠程代理,也就是為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在於不同地址空間的事實。
- 虛擬代理,根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的對象。
- 安全代理,用來控制真實對象訪問時的權限。
- 智能指引,當調用目標對象時,代理可以處理其他的一些操作。
- 總結
- 代理模式其實很好理解,代理,代理,我們的生活中,一般明星都有自己的經紀人,那麽經紀人就是明星的代理,我們租房找的中介也是物主的代理人。所以代理模式中代理對象可以在客戶端和目標對象之間起到中介的作用
設計模式(8)----代理模式