Android插件化開發(fā)基礎(chǔ)之靜態(tài)代理模式

一 Proxy模式

意圖:

       為其他對象提供一種代理以控制這個(gè)對象的訪問。

適用性:

  l  遠(yuǎn)程代理( Remote Proxy ): 為一個(gè)對象在不同的地址空間提供局部代表。

  l  虛代理(Virtual Proxy)根據(jù)需要?jiǎng)?chuàng)建開銷很大的對象。使用一個(gè)代理對象作為代表,在真正的需要時(shí)進(jìn)行創(chuàng)建。

  l  保護(hù)代理(Protection Proxy):控制對原始對象的訪問。保護(hù)代理用于對象應(yīng)該有不同的訪問權(quán)限的時(shí)候。

  l  智能指引(Smart Reference): 取代了簡單的指針,它在訪問對象時(shí)執(zhí)行一些附加操作。對指向?qū)嶋H對象的引用計(jì)數(shù),

    這樣當(dāng)該對象沒有引用時(shí),可以自動(dòng)釋放它,智能指針當(dāng)?shù)谝淮我靡粋€(gè)持久對象時(shí),將它裝入內(nèi)存。

    在訪問一個(gè)實(shí)際對象前,檢查是否已經(jīng)鎖定了它,以確保其他對象不能改變它

 

其實(shí)每個(gè)模式名稱就表明了該模式的作用,代理模式就是多一個(gè)代理類出來,替原對象進(jìn)行一些操作,比如我們在租房子的時(shí)候回去找中介,為什么呢?因?yàn)槟銓υ摰貐^(qū)房屋的信息掌握的不夠全面,希望找一個(gè)更熟悉的人去幫你做,此處的代理就是這個(gè)意思。再如我們有的時(shí)候打官司,我們需要請律師,因?yàn)槁蓭熢诜煞矫嬗袑iL,可以替我們進(jìn)行操作,表達(dá)我們的想法。先來看看關(guān)系圖:

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

    public interface Sourceable {  
        public void method();  
    }  


 

    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!

代理模式的應(yīng)用場景:

如果已有的方法在使用的時(shí)候需要對原有的方法進(jìn)行改進(jìn),此時(shí)有兩種辦法:

1、修改原有的方法來適應(yīng)。這樣違反了“對擴(kuò)展開放,對修改關(guān)閉”的原則。

2、就是采用一個(gè)代理類調(diào)用原有的方法,且對產(chǎn)生的結(jié)果進(jìn)行控制。這種方法就是代理模式。

使用代理模式,可以將功能劃分的更加清晰,有助于后期維護(hù)!

 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)