1. 程式人生 > >重走Java設計模式——代理模式(Proxy Pattern)

重走Java設計模式——代理模式(Proxy Pattern)

代理模式

定義

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

程式碼示例

我們將建立一個Image 介面和實現了 Image 介面的實體類。ProxyImage 是一個代理類,減少 RealImage 物件載入的記憶體佔用。
ProxyPatternDemo,我們的演示類使用ProxyImage來獲取要載入的Image 物件,並按照需求進行顯示。
在這裡插入圖片描述

1.建立一個介面

Image.java

public interface Image {
   void display();
}

2.建立實現介面的實體類

RealImage.java

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

ProxyImage.java

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

3.當被請求時,使用 ProxyImage 來獲取 RealImage 類的物件

ProxyPatternDemo.java

public class ProxyPatternDemo {
   
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");
 
      // 影象將從磁碟載入
      image.display(); 
      System.out.println("");
      // 影象不需要從磁碟載入
      image.display();  
   }
}

4.驗證輸出

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

模式優缺點

優點

  1. 職責清晰;
  2. 高擴充套件性;
  3. 智慧化。

缺點

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

使用場景

按職責來劃分,通常有以下使用場景:
1、遠端代理。;
2、虛擬代理;
3、Copy-on-Write 代理;
4、保護(Protect or Access)代理;
5、Cache代理;
6、防火牆(Firewall)代理;
7、同步化(Synchronization)代理;
8、智慧引用(Smart Reference)代理。

使用的注意事項

1、和介面卡模式的區別:介面卡模式主要改變所考慮物件的介面,而代理模式不能改變所代理類的介面。
2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。