1. 程式人生 > >設計模式之五 --- 代理(Proxy)模式

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

【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);
    }

	@Override
	public 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; 
    }

	@Override
	public 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.Photo1
Displaying Andy.Photo1
Loading   Andy.Photo2
Displaying Andy.Photo2
總結下代理模式的應用場合:

第一:遠端代理,也就是為一個物件在不同的地址空間提供區域性代表,這樣可以隱藏一個物件存在於不同地址空間的事實。

第二:虛擬代理,是根據需要建立開銷很大的物件,通過它來存放例項化需要很長時間的真實物件。

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

第四:智慧引用,是指當呼叫真實物件時,代理處理另外一些事。本文的例子就是採用了這一點。