設計模式之五 --- 代理(Proxy)模式
阿新 • • 發佈:2019-02-05
【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
3.3 Proxy類:ProxyImage.javapackage 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); } @Override public void displayImage() { System.out.println("Displaying " + filename); } }
3.4 客戶端測試類:ProxyClient.javapackage 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; } @Override public void displayImage() { if(image == null) image = new RealImage(filename); image.displayImage(); } }
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.Photo1
Displaying Andy.Photo1
Loading Andy.Photo2
Displaying Andy.Photo2
總結下代理模式的應用場合:
第一:遠端代理,也就是為一個物件在不同的地址空間提供區域性代表,這樣可以隱藏一個物件存在於不同地址空間的事實。
第二:虛擬代理,是根據需要建立開銷很大的物件,通過它來存放例項化需要很長時間的真實物件。
第三:安全代理,用來控制真實物件訪問時的許可權。
第四:智慧引用,是指當呼叫真實物件時,代理處理另外一些事。本文的例子就是採用了這一點。