代理模式也是一種結構性模式,它的主要作用是建立一個現有對象的代理,以便我們能夠針對對象的生命周期、通路權限等進行控制。代理模式和擴充卡模式的差別是:擴充卡模式主要用于現有接口和新接口之間的轉換和銜接,而代理模式對現有接口進行控制,是以代理模式不能改變對象的接口。
假設我們有一個字元資源類,它實作了資源接口,并且能夠随意設定字元串的值。
public interface Resource {
String getResource();
}
public class StringResource implements Resource {
private String content;
public StringResource(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String getResource() {
return content;
}
}
為了對字元資源進行控制,我們可以建立一個代理,這個代理同樣實作了資源接口,但是我們可以在通路資源的時候對資源進行控制,比如這裡就取消了通路器方法,讓資源變成了隻讀的。
public class StringResourceProxy implements Resource {
private Resource resource;
public StringResourceProxy(Resource resource) {
this.resource = resource;
}
@Override
public String getResource() {
return "In proxy:" + resource.getResource();
}
}
這樣,我們可以将代理對象當做實際對象來使用,而且還不會造成未知的風險。
public void run() {
Resource resource = new StringResource("Some resource");
System.out.println(resource.getResource());
Resource resourceProxy = new StringResourceProxy(resource);
System.out.println(resourceProxy.getResource());
}
代理模式的應用非常廣泛。我們上面這個例子是靜态代理,也就是需要我們手動編寫一個代理類。在一些語言例如Java中還支援動态代理,我們不必完整的編寫一個代理類,隻需要調用相關類和方法即可實作代理模式了。動态代理在Spring AOP等很多架構裡都有應用。