其實,代理模式在生活中的應用不少,典型的例如明星的經紀人,外界與明星的聯繫都由經紀人來負責,什麼電話該接進來,什麼活動該拒絕都交給經紀人,這樣在最大程度上保護了明星的隱私。這種模式也符合單一職責約束,明星只用作好本身的事情,其餘的雜事經紀人會搞定的。設計模式
下面,咱們就來用代碼模擬一下明星和經濟人的場景,從而瞭解代理模式的具體用法。ide
做爲利益共同體,經紀人和明星須要具備共同的行爲,只不過真正作事的是明星,經紀人負責傳話,所以他們須要一個共同Activiey接口:this
public interface Activity { public void interview(); public void arietyShow(); }
明星類:spa
public class Star implements Activity{ @Override public void interview() { System.out.println("明星接受採訪。。。"); } @Override public void arietyShow() { System.out.println("明星參加綜藝節目。。。"); } }
經紀人類:設計
public class Agent implements Activity{ Star star; public Agent(Star star){ this.star = star; } @Override public void interview() { this.star.interview(); } @Override public void arietyShow() { this.star.arietyShow(); } }
接下來就能夠模擬一下明星-經紀人這種代理場景的運做了:代理
public class ProxyTest { public static void main(String[] args) { Agent agent = new Agent(new Star()); agent.arietyShow(); agent.interview(); } }
輸出爲:code
明星參加綜藝節目。。。
明星接受採訪。。。
上面簡單介紹了代理模式的概念和具體場景的使用,那麼,代理模式的正式定義是怎樣的呢,Gof四人組給出的定義是:對象
代理模式爲對象提供一個替身,從而控制對這個對象的訪問。blog
外界的請求經過代理到達實際對象,實際對象的響應經過代理返回給外界。代理模式一個明顯的優勢是限制外界對對象的訪問,從而起到保護對象的做用,缺點是增長了複雜性,並且因爲須要代理作轉換,增長了調用鏈的長度。接口
將明顯-經紀人的結構抽象出來,就能夠獲得代理模式的通常結構,以下:
當因爲某種緣由不能將對象直接暴露給外界時,或者須要限制對對象的訪問時,就能夠考慮使用代理模式。本文介紹的代理模式是基於代理對象和實際對象在同一個JVM堆上的情形,除此以外,代理模式還有如下幾種:
<<Head First設計模式>>
<<大話設計模式>>