1. 程式人生 > >設計模式之12--代理模式

設計模式之12--代理模式

代理模式學習筆記

代理模式是常用的結構型設計模式,當無法直接訪問某個物件的時候可以通過一個代理物件來間接訪問。為了保證客戶端使用的間接性,所訪問的真實物件與代理物件需要實現相同的介面。根據使用目的可以分為保護代理、遠端代理、虛擬代理、緩衝代理等。

定義:給某一個物件提供一個代理或者佔位符,並由代理物件來控制對原物件的訪問

如下是代理模式的結構圖:

從上圖中可以看出代理模式中主要有如下幾個角色:

subject,它聲明瞭真實類和代理類共同有的介面,這樣子的話客戶類就可以針對Subject進行程式設計。

Proxy代理類,代理類繼承Subject類,並且含有一個真實類的引用,這樣子就可以把請求轉發給真實類,另外除了和真實類相同的介面外,代理類還可以增加額外的介面功能。

RealSubject真實類,真實類也是Subject類的的子類,Subject是對外介面的真正實現的地方。

具體程式碼實現如下:

interface Subject {
    public void Request() { };
}

class Proxy implements Subject {
    private RealSubject realSubject = new RealSubject();
    public void PreRequest() {
        /*TODO*/
    }

    public void PostRequest() {
        /*TODO*/
} public void Request() { PreRequest(); realSubject.Request(); PostRequest(); } } class Proxu implememnts Subject { public void Request() { }; }

上面的程式碼實現只是很簡單的一種,而在現實生產中實際的程式碼會複雜的多。另外根據不同的使用目的和場景,代理模式還可以如下幾種情況:

  1. 遠端代理 為一個位於不同的地址空間的物件提供一個本地的代理物件,這個不同的地址空間可以在同一臺主機中,也可以是在另外一臺主機中。
  2. 虛擬代理 如果需要建立一個資源消耗較大的物件,先建立一個消耗相對較小的物件來表示,真實物件只在需要的時候才會被真正的建立
  3. 保護代理 控制對一個物件的訪問,可以給不同的使用者提供不同級別的使用許可權
  4. 緩衝代理 為某一個目標操作的結果提供臨時的儲存空間,以便多個客戶端可以共享這些資料。
  5. 智慧引用代理 當一個物件被引用時,提供一些額外的操作,例如將物件被呼叫的次數記錄下來等。

總結:
代理模式通過增加一個代理類,能夠將客戶類的請求轉發給真實類處理,同時將真實類的介面抽象出來成為一個抽象類,那麼客戶類之後就只需要針對抽象類進行程式設計。對於客戶來說,代理類時透明的,它們不需要知道代理類的存在。

不過因為客戶類的請求需要通過代理類進行中轉,那麼可能會造成請求處理速度變慢。