天天看點

Android插件化開發基礎之靜态代理模式

一 Proxy模式

意圖:

      為其他對象提供一種代理以控制這個對象的通路。

适用性:

 l  遠端代理( Remote Proxy ): 為一個對象在不同的位址空間提供局部代表。

 l  虛代理(Virtual Proxy)根據需要建立開銷很大的對象。使用一個代理對象作為代表,在真正的需要時進行建立。

 l  保護代理(Protection Proxy):控制對原始對象的通路。保護代理用于對象應該有不同的通路權限的時候。

 l  智能指引(Smart Reference): 取代了簡單的指針,它在通路對象時執行一些附加操作。對指向實際對象的引用計數,

   這樣當該對象沒有引用時,可以自動釋放它,智能指針當第一次引用一個持久對象時,将它裝入記憶體。

   在通路一個實際對象前,檢查是否已經鎖定了它,以確定其他對象不能改變它

其實每個模式名稱就表明了該模式的作用,代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什麼呢?因為你對該地區房屋的資訊掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。再如我們有的時候打官司,我們需要請律師,因為律師在法律方面有專長,可以替我們進行操作,表達我們的想法。先來看看關系圖:

Android插件化開發基礎之靜态代理模式

根據上文的闡述,代理模式就比較容易的了解了,我們看下代碼:

1. public interface Sourceable {  
2.     public void method();  
3. }      
public class Source implements Sourceable {  
  
    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}        
public class Proxy implements Sourceable {  
  
    private Source source;  
    public Proxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}       
public class ProxyTest {  
  
    public static void main(String[] args) {  
        Sourceable source = new Proxy();  
        source.method();  
    }  
  
}        

輸出:

before proxy!

the original method!

after proxy!

代理模式的應用場景:

如果已有的方法在使用的時候需要對原有的方法進行改進,此時有兩種辦法:

1、修改原有的方法來适應。這樣違反了“對擴充開放,對修改關閉”的原則。

2、就是采用一個代理類調用原有的方法,且對産生的結果進行控制。這種方法就是代理模式。

使用代理模式,可以将功能劃分的更加清晰,有助于後期維護!

繼續閱讀