設計模式----Proxy(代理)模式

來源:互聯網
上載者:User
設計模式 ----Proxy( 代理 ) 模式   GOF 為其他對象提供一種代理以控制對這個對象的訪問。   和Flyweight不一樣Proxy本身就是代理的意思。對一個對象進行存取控制的原因是,當我們確實需要這個對象,或者這個對象的某些功能後才去使用它。在一個論壇系統中(比如說非常著名的“天涯社區”)來說,瀏覽該論壇的有兩種基本使用者,一種是註冊使用者:可以發表文章,修改自己發表的文章,刪除自己的文章,回複別人的文章等。另一種是遊客(非註冊使用者):只有看文章的許可權。在這樣的系統中就可以用Proxy模式來代理控制這樣兩種使用者的許可權。   根據我在各種參考資料上看到的內容,Proxy模式還有許多變種,他適用於很多地方。在GOF的書中,闡述了如下使用Proxy模式的情景: 1.  遠程代理(Remote Proxy):為一個對象在不同地址空間提供局部代表。 2.  虛代理(Virtua Proxy):根據需要建立開銷很大的對象。比如說,在網站上看圖片,一般都先顯示小圖片,想看大圖片的時候可以點擊小圖片。 3.  保護代理(Protection Proxy):控制對原始對象的訪問。保護代理用於對象應該有不同的存取權限的時候。例如我們上面提到的論壇系統。 4.  智能指引(Smart Reference)取代了簡單的指標,它在訪問對象時執行一些附加操作。他的典型用途包括:對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放他(也稱為Smart Pointers。這個好像在C++中有專門的講解);當第一次引用一個持久對象時,將他裝入記憶體;在訪問一個實際對象前,檢查是否已經鎖定了他,以確保其他對象不能改變他。   舉一個簡單的例子來說明Proxy模式。在娛樂圈裡明星要演出,要做廣告這些事情都不是明星自己和商家談,而是有一個自己的經濟人,這個經濟人就代理這個明星的一切外事活動。比如說和某某電影公司簽約阿,或者和某廠家簽約廣告啊什麼的。這個經濟人就是個代理的腳色,他和商家談判的時候覺得可行就讓明星去演出或去拍廣告,如果談判不行他就取消該商家和該明星的聯絡活動,一定程度上來說他控制者明星的活動。   下面看簡單的代碼:
package  Proxy;

public  abstract  class  MusicPerson
... {
    public abstract void age();
    public abstract void requital();//報酬
    public abstract void date();
} // end class MusicPerson

明星出場:
package  Proxy;

public  class  MusicStar  extends  MusicPerson
... {
    public void date()
    ...{
        System.out.println("the music person's date");
    }//end f()
    
    public void requital()
    ...{
        System.out.println("the music person's retuital");
    }//end g()
    
    public void age()
    ...{
        System.out.println("the musicperson's age");
    }//end h()
    
} // end class MusicStar

代理人來了:
package  Proxy;

public  class  MusicStarProxy  extends  MusicPerson
... {
    private MusicPerson implementation;
    
    public MusicStarProxy()
    ...{
        implementation = new MusicStar();
    }

    public void date() 
    ...{ 
        implementation.date();
    }//end date()
    
    public void requital()
    ...{ 
        implementation.requital(); 
    }//end requital()
    
    public void age() 
    ...{ 
//        implementation.age();
        System.out.println("Sorry I can't tell you the musicstar's age!");
    }//end age()
    
} // end class MusicStarProxy

Porxy模式的運用:
package  Proxy;

public  class  ProxyPattern
... {

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.