天天看點

設計模式(十三) 代理模式

代理模式也是一種結構性模式,它的主要作用是建立一個現有對象的代理,以便我們能夠針對對象的生命周期、通路權限等進行控制。代理模式和擴充卡模式的差別是:擴充卡模式主要用于現有接口和新接口之間的轉換和銜接,而代理模式對現有接口進行控制,是以代理模式不能改變對象的接口。

假設我們有一個字元資源類,它實作了資源接口,并且能夠随意設定字元串的值。

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等很多架構裡都有應用。