2016-05-31 22 views
0

http://www.tutorialspoint.com/design_pattern/proxy_pattern.htm代理設計圖案 - tutorialspoint.com例如

嗨,

我期待使用上述 鏈接的例子就明白了在Java代理設計模式。在主要方法我不明白之間的差異:

//image will be loaded from disk 

    image.display(); 
    System.out.println(""); 

    //image will not be loaded from disk 

    image.display(); 

這是一個錯字?相同的2個image.display()方法如何提供不同的輸出?

非常感謝!

+0

awwww right ..謝謝大家! – Bubu

+0

非常感謝!這是代理模式的正確預期實現嗎? – Bubu

回答

1

不,這不是一個錯字。

  • 第一次調用image.display()時,它從磁盤加載映像。它存儲它加載的內容,所以...
  • 第二次(以及後續時間)你稱之爲,它不需要再次從磁盤加載圖像。
+0

謝謝你的澄清! – Bubu

3

這不是拼寫錯誤。如果您在ProxyImage定義在本教程看,它顯然有狀態:

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

當第一次調用時,realImage爲空,並且圖像會從磁盤加載。之後,加載的圖像被存儲到image.realImage並顯示。在第二次調用時,圖像已被緩存,因此不需要從磁盤加載。

+0

非常感謝!這是代理模式的正確預期實現嗎? – Bubu

+0

@Bubu是的,這是一個如何使用代理模式的例子。 – hexafraction

0

理解它的唯一區別和簡單的方法是使用構造函數並調用功能方法,即在此處加載圖像。如果你通過實現這個非代理MainFunctionalityClass來實例化你的接口,並且這個實現在這個構造器中加載圖像。然而,使用代理是在MainFunctionalityClass上應用一個包裝器,這次被調用的構造器是Proxy的構造器,這意味着MainFunctionalityClass構造器在這裏被跳過。

class MainFunctionalityClass implements ICommon{ 

    MainFunctionalityClass(){ 
    loadMainFunctionality(); // Costly call 
    } 
} 

雖然代理類定義爲:

class Proxy implements ICommon{ 
private String var; 

Proxy(String var){ 
this.var = var; //NO call to big functionality, not costly 
} 

callMainFunctionality(){ 
//uses var, MainFunctionalityClass() called 
// Costly call but it is called on demand, 
} 

class MainClassTest{ 
public static void main(String[] args){ 
ICommon p = new Proxy("abcd"); 
p.callMainFunctionality(); 
} 

} 

代理設計模式可用於

  1. 按需加載大功能懶洋洋地。
  2. 限制客戶端的

爲了實現它,我們需要先用相同的接口在兩個類,然後使用組成的代理類的操作(上方說明)。