天天看點

GOF23代理模式之靜态代理模式了解之經典

      
設計模式之代理模式之靜态代理模式      
     代理模式(Proxy
pattern)      
         核心作用:      
              通過代理,控制對對象的通路。      
                   可以通過詳細控制通路某個(某類)對象的方法,在調用這個方法前做前置處理,調用這個方法後做後置處理。(即AOP的微觀實作)      
              AOP(面向切面程式設計。Aspect
Oriented Programming)的核心實作的機制      
         舉個例子來了解這種模式。例如明星,我的偶像周傑倫唱歌這種事。倘若有某個客戶想讓傑倫來唱歌。當然,傑倫作為明星類的對象,内部可以具有      
  1. 面談      
  2. 合同起草      
  3. 簽字,收預付款      
  4. 安排機票和車輛      
  5. 唱歌      
  6. 收尾款      
當然,這樣也會實作客戶的需求。但是我們可以看到,傑倫會有多累呀。而且在這個過程中有太多事不需要傑倫操心。比如,面談,合同起草等等,傑倫唯一需要關心的就是唱歌。我們當然不允許傑倫被其他的瑣事分心,但其他的事情畢竟也很要緊,而且是每場演唱會都要坐做的流程。是以不能缺少。      
是以,這也就出現了經紀人的概念。      
倘若,此刻有使用者想請傑倫來唱歌。他需要做的隻是找傑倫的經紀人,來讓經紀人面談,合同起草,收尾款等等。而在客戶要求代理唱歌的時候,在具體實作的過程中,由代理請求傑倫來唱歌。當然,這種結構很友善,因為如果這個經紀人也有其他的明星,隻需要修改經紀人(代理)的内部的唱歌的方法就可以了。      
代理模式(Proxy
Pattern)      
     核心角色:      
  • 抽象角色
    
    定義代理角色和真是角色的公共對外方法。換言之代理角色和真實角色擁有一套相同的來自于抽象角色的方法      
  • 真實角色
    
    實作抽象角色,定義真實角色所要實作的業務邏輯(比如唱歌,傑倫會唱歌,而代理人并不會唱),供代理角色使用
    
    關注真正的業務邏輯(唱歌)      
  • 代理角色:
    
    實作抽象角色,是真實角色的代理(經紀人),通過真實角色的業務邏輯(換言之,代理角色需要有個真實角色的成員變量,以通路真實角色的業務邏輯(比如唱歌))來實作抽象方法。并可以附加自己的操作。
    
    
    
    将統一的流程控制放到代理角色中處理      
應用場景:      
     安全代理:屏蔽對真實角色的通路      
     遠端代理:通過代理類處理遠端方法調用(RMI)

     延遲加載:先加載輕量級的代理對象,真正需要再加載真實對象。      
         比如你要開發一個大文檔檢視軟體,大文檔有大量圖檔,有可能一個圖檔有100M,在打開檔案時不可能将所有的圖檔都顯示出來,這樣就可以使用代理模式,當需要檢視圖檔時,用Proxy進行大圖檔的打開。      
分類:      
     靜态代理(靜态定義代理類),即我們自己動手實作。      
     動态代理(動态生成代理類):不需要我們自定義,使用預設的      
  • JDK自帶的動态代理      
  • Javaassist位元組碼操作庫實作      
  • CGLIB      
  • ASM(底層使用指令,可維護性較差)      

繼續閱讀