設計模式之五 — 代理(Proxy)模式

來源:互聯網
上載者:User

【1】基本概念

           代理模式(Proxy):為其他對象提供一種代理以控制對這個對象的訪問。代理者可以作任何東西的介面:網路連接、記憶體中的大物件、檔案或其它昂貴或無法複製的資源。

【2】簡單分析

我們先看一下該設計模式的UML結構圖:

我們通過上面的結構圖可以看到:

Subject類:定義了RealSubject和Proxy的共用介面,這樣就可以在任何使用RealSubject的地方都可以用Proxy。

RealSubject類:定義Proxy所代表的真實實體。

Proxy類:儲存一個引用使得代理可以訪問實體,並提供一個與Subject的介面相同的介面,這樣代理就可以用來替代實體。

【3】如何用java語言實現該模式

我們先看下代碼的結構圖,該模式的代碼實現比較簡單:

3.1 Subject類:Image.java

package com.andyidea.patterns.subject;/** * Subject類 * @author Andy.Chen * */public abstract class Image {public abstract void displayImage();}

3.2 RealSubject類:RealImage.java

package com.andyidea.patterns.realsubject;import com.andyidea.patterns.subject.Image;/** * RealSubject類 * @author Andy.Chen * */public class RealImage extends Image {    private String filename;    public RealImage(String filename) {         this.filename = filename;        loadImageFromDisk();    }     private void loadImageFromDisk() {            System.out.println("Loading   " + filename);    }@Overridepublic void displayImage() {System.out.println("Displaying " + filename); }}

3.3 Proxy類:ProxyImage.java

package com.andyidea.patterns.proxy;import com.andyidea.patterns.realsubject.RealImage;import com.andyidea.patterns.subject.Image;/** * Proxy類 * @author Andy.Chen * */public class ProxyImage extends Image {    private String filename;    private Image image;     public ProxyImage(String filename) {         this.filename = filename;     }@Overridepublic void displayImage() {        if(image == null)            image = new RealImage(filename);                image.displayImage();}}

3.4 用戶端測試類別:ProxyClient.java

package com.andyidea.patterns.client;import com.andyidea.patterns.proxy.ProxyImage;import com.andyidea.patterns.subject.Image;/** * 代理模式用戶端測試類別 * @author Andy.Chen * */public class ProxyClient {public static void main(String[] args) {System.out.println("Welcome to Andy.Chen Blog!" +"\n"            +"Proxy Patterns." +"\n"           +"-------------------------------");Image mImage1 = new ProxyImage("Andy.Photo1");Image mImage2 = new ProxyImage("Andy.Photo2");mImage1.displayImage();mImage2.displayImage();}}

【4】程式運行結果:

Welcome to Andy.Chen Blog!Proxy Patterns.-------------------------------Loading   Andy.Photo1Displaying Andy.Photo1Loading   Andy.Photo2Displaying Andy.Photo2

總結下代理模式的應用場合:

第一:遠程代理,也就是為一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實。

第二:虛擬代理,是根據需要建立開銷很大的對象,通過它來存放執行個體化需要很長時間的真實對象。

第三:安全代理,用來控制真實對象訪問時的許可權。

第四:智能引用,是指當調用真實對象時,代理處理另外一些事。本文的例子就是採用了這一點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.