iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Software Development

從生活中認識Design Pattern系列 第 21

[Day21] 代理模式 | Proxy Pattern

文同步分享於個人blog

  • 定義


爲其他物件提供一種代理以控制對這個物件的訪問。

代理模式是一種物件結構型模式。在代理模式中引入了一個新的代理物件,代理物件在客戶端物件和目標物件之間起到中介的作用,它去掉客戶不能看到的內容和服務或者增添客戶需要的額外的新服務。我想要買日本的藥妝產品,但我無法自己跑去日本買,這時就有代購出現了。於是我就委託他去日本幫忙買我要的商品,不需要自己飛一趟日本。

  • Proxy Pattern 成員


成員 功用
Subject 定義RealSubject和Proxy實作的業務方法,可是介面或抽象類別。
RealSubject 實作Subject中的方法,為最終要引用的物件。
Proxy 提供與RealSubject相同的接口,內部引用RealSubject,可以訪問、控制或擴充RealSubject的工能。

p1

  • Proxy Pattern 應用


Proxy Pattern有很多種方式可以用,但他不像別的Pattern是不同的Pattern方法,他比較像不同的應用。

1. 遠端代理:

讓一個位於不同地址的物件,提供一個區域的代表物件。如可以將美國地區的服務通過代理模式變成台灣地區服務的一部分。

2. 虛擬代理:

將一個需要消耗很大資源或者比較複雜的物件延遲到真正需要時才建立。如載入圖片時,圖檔過大,先用小檔圖片Proxy來代替真正的圖片。

3. 保護代理:

這種代理通常用於控制不同類的Client對RealSubject的訪問權限。例如:論壇的會員等級。

4. 智慧代理:

用於調用目標物件時,代理附加一些額外的功能。比如:紀錄訪問的流量。

5. 延遲載入:

為了提高系統性能,而言直對目標的載入。如:Hibernate中屬性的延遲載入。

  • Proxy Pattern 實作


一開始有提到,想要買日本的藥妝品,無法自己飛過去只能請代購的例子,現在我們就來實作。

首先先將Subject建立起來:

interface IPurchasing {
    void Request();
}

接著需要一個真正的類別RealSubject,他來實作Subject,主要就是在日本買東西:

class Purchasing implements IPurchasing {
    public void Request() {
        System.out.println("Shopping in japan");
    }
}

然後建立代購的人Proxy,Proxy內除了有Request以外,還可以增加一些方法。preRequest()含有確認品項以及記錄到底有多少人需要代購兩個邏輯;而postRequest()則是ㄧ買完回來要把東西寄給買家。

class ProxyBuyer implements IPurchasing {
    private Purchasing purchasing;
    public void Request() {
        if (purchasing == null) {
            purchasing = new Purchasing();
        }
        preRequest();
        purchasing.Request();
        postRequest();
    }
    public void preRequest() {
        System.out.println("Confirm shopping items");
        System.out.println("Record the number of purchasers");
    }
    public void postRequest() {
        System.out.println("delivery");
    }
}

最後身為買家的我,只要呼叫ProxyBuyer就可以請他幫我買到日本的藥妝了。

public class MyClass {
    public static void main(String args[]) {
        ProxyBuyer proxy = new ProxyBuyer();
        proxy.Request();
    }
}

p2

其實這也就是一個生活化的例子,可以把它想成服務在日本並不在台灣,我們藉由遠端代理的方式,將日本的服務包裝在proxy內,供台灣系統使用。使用者只需要知道從proxy就可以使用到服務,不需要知道服務在哪邊。而在proxy內有一個紀錄代購人數的地方,就像用智慧代理一樣,每當proxy被調用時,就會有紀錄,就可以追蹤一個時段內有多少人使用了這個服務。

  • 小結


Proxy Pattern的目標

爲其他物件提供一種代理以控制對這個物件的訪問。

Proxy Pattern的成員
Subject:定義代理的方法。
RealSubject:被代理者。
Proxy:代理者。
Proxy Pattern的優缺點
優點
1. 代理物件可以擴充目標物件的功能
2. 代理模式可以將Client跟目標物件分離,降低系統的耦合,增加程式的可擴充性。
3. 代理模式有中介及保護目標物件的作用。
缺點
1. 會增加系統設計中類別的數量。
2. Client和目標物件中增加了一個代理物件,會增造成請求處理速度變慢。
3. 增加了系統的複雜度。
Proxy Pattern的應用
1. 遠端代理
2. 虛擬代理
3. 保護代理
4. 智慧代理
5. 延遲載入
  • 範例程式碼


範例:實作Proxy Pattern

  • References


代理模式(代理设计模式)详解
代理模式(Proxy Pattern)(一):代理模式介紹
代理模式


上一篇
[Day20] 享元模式 | Flyweight Pattern
下一篇
[Day22] 責任鏈模式 | Chain of Responsibility Pattern
系列文
從生活中認識Design Pattern30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言