重走Java設計模式——代理模式(Proxy Pattern)
阿新 • • 發佈:2018-11-09
代理模式
定義
為其他物件提供一種代理以控制對這個物件的訪問。
程式碼示例
我們將建立一個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、Copy-on-Write 代理;
4、保護(Protect or Access)代理;
5、Cache代理;
6、防火牆(Firewall)代理;
7、同步化(Synchronization)代理;
8、智慧引用(Smart Reference)代理。
使用的注意事項
1、和介面卡模式的區別:介面卡模式主要改變所考慮物件的介面,而代理模式不能改變所代理類的介面。
2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。