Design Pattern

Chapter 11 代理模式(Proxy Pattern)

定義

代理者是指一個類別可以作為其它東西的介面。代理者可以作任何東西的介面:網路連接、記憶體中的大物件、檔案或其它昂貴或無法複製的資源。

組成

  1. 抽象主題角色(Person):聲明了真實主題和代理主題的公共接口。
  2. 代理主題角色(Friend):代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對像操作時,附加其他的操作,相當於對真實對象進行封裝。
  3. 真實主題角色(RealBuyPerson):定義了代理角色所代表的真是對象。

程式碼

Step1

public interface Image {
    void display();
}

Step2

public class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);

    }

    private void loadFromDisk(String fileName) {
        System.out.println("Loading " + fileName);
    }
}


public class ProxyImage implements Image {

    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

Step3

public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");
        image.display();
        System.out.println("");
        image.display();
    }
}

Step4(Output)

Loading test.jpg
Displaying test.jpg

Displaying test.jpg

優點

  1. 代理模式能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。
  2. 保護代理可以控制對真實對象的使用權限。

缺點

  1. 由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
  2. 實現代理模式需要額外的工作,有些代理模式的實現非常複雜。