設計模式:代理模式(Proxy)

轉自於:http://blog.csdn.net/jungle_hello/article/details/51173882

定義與結構

其實每個模式名稱就表明了該的作用,代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候會去找中介爲什麼呢?因爲你對該地區房屋的信息掌握的不夠全面,希望找一個更熟悉人去幫你做,此處代理就是這意思。再如,我們有的時候想要打官司,我們需要請律師,因爲律師在法律方面有專長,可以替我們進行操作,表達我們的想法,先來看關係圖:

這裏寫圖片描述

代理模式中的“代理商”要想實現代理任務,就必須和被代理的“廠商”使用共同的接口(你可以想象爲產品)。於是代理模式就有三個角色組成了:
1) 抽象主題角色(Subject):聲明瞭真實主題和代理主題的共同接口。
2) 代理主題角色(ProxySubject):內部包含對真實主題的引用,並且提供和真實主題角色相同的接口。
3) 真實主題角色(RealSubject):定義真實的對象。

網上的很多關於代理模式的例子都舉的不錯如:
1、Windows 裏面的快捷方式。
2、豬八戒去找高翠蘭結果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象 出來,高翠蘭本人和孫悟空都實現了這個接口,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類。
3、買火車票不一定在火車站買,也可以去代售點。
4、一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,並提供對簽發人賬號上資金的控制。
5、spring aop。

代理模式的實現

我們將創建一個 Image 接口和實現了 Image 接口的實體類。ProxyImage 是一個代理類,減少 RealImage 對象加載的內存佔用。
ProxyPatternDemo,我們的演示類使用 ProxyImage 來獲取要加載的 Image 對象,並按照需求進行顯示。

//抽象主題角色--Subject
public interface Image {
   void display();
}
//真是主題角色--RealSubject
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);
   }
}
//代理主題角色--ProxySubject
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();
   }
}
//測試類
public class ProxyPatternDemo { 
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");
      //圖像將從磁盤加載
      image.display(); 
      System.out.println("");

      image.display();  
   }
}

驗證輸出

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

總結

代理模式能夠協調調用者和被調用者,能夠在一定程度上降低系統的耦合度。代理模式中的真實主題角色可以結合組合模式來構造,這樣一個代理主題角色就可以對一系列的真實主題角色有效,提高代碼利用率,減少不必要子類的產生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章