代理模式是一種結構型設計模式,它允許通過創建一個代理對象來控制對實際對象的訪問。代理對象充當了實際對象的替代品,可以在調用實際對象的方法之前或之后添加額外的邏輯。代理模式可以用于許多不同的場景,以下是幾個常見的應用場景:
遠程代理:當客戶端需要訪問遠程服務器上的對象時,可以使用遠程代理。遠程代理隱藏了真正的遠程對象,并提供了本地接口來代理遠程對象的訪問。
虛擬代理:當創建一個開銷很大的對象時,可以使用虛擬代理。虛擬代理在使用到對象時才會真正創建對象,可以延遲對象的創建時間。
安全代理:當需要對對象的訪問進行控制時,可以使用安全代理。安全代理可以檢查用戶對對象的訪問權限,并決定是否允許訪問。
緩存代理:當需要緩存對象的結果時,可以使用緩存代理。緩存代理在第一次訪問對象時會將結果緩存起來,以后的訪問可以直接使用緩存的結果,避免重復計算。
下面是一個遠程代理的示例,演示了如何使用代理模式來訪問遠程服務器上的對象:
// 定義一個共享接口
public interface Image {
void display();
}
// 實際對象
public class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading image: " + filename);
}
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// 代理對象
public class ProxyImage implements Image {
private String filename;
private RealImage image;
public ProxyImage(String filename) {
this.filename = filename;
}
public void display() {
if (image == null) {
image = new RealImage(filename);
}
image.display();
}
}
// 使用遠程代理
public class Client {
public static void main(String[] args) {
Image image = new ProxyImage("image.jpg");
image.display();
}
}
在上面的示例中,ProxyImage
是一個代理對象,它實現了Image
接口,并在display()
方法中創建了一個實際的RealImage
對象。當第一次調用display()
方法時,代理對象會創建實際對象并調用其display()
方法。以后的調用將直接使用實際對象。這樣,客戶端可以通過代理對象間接地訪問遠程服務器上的圖片。