在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。
在代理模式中,我們創建具有現有對象的對象,以便向外界提供功能接口。
關鍵代碼:實現與被代理類組合。
優點: 1、職責清晰。 2、高擴展性。 3、智能化。
缺點: 1、由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。 2、實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
注意事項: 1、和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。 2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。
- 創建一個接口。
/**
* 1. 創建一個接口
* @author mazaiting
*/
public interface Image {
/**
* 顯示
*/
void display();
}
- 創建實現接口的實體類。
/**
* 2. 創建實現接口的實體類。
* @author mazaiting
*/
public class RealImage implements Image{
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk(fileName);
}
private void loadFromDisk(String filename) {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + fileName);
}
}
/**
* 2. 創建實現接口的實體類。
* @author mazaiting
*/
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
public void display() {
if (null == realImage){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
- 當被請求時,使用 ProxyImage 來獲取 RealImage 類的對象。
public class Client {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
// 圖像將從磁盤加載
image.display();
System.out.println("");
// 圖像將無法從磁盤加載
image.display();
}
}
- 打印結果
Loading test.jpg
Displaying test.jpg
Displaying test.jpg