2 代理模式

代理模式

① 代理模式的概念

代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。通俗的來講代理模式就是我們生活中常見的中介

    舉個例子來說明:假如說我現在想買一輛二手車,雖然我可以自己去找車源,做質量檢測等一系列的車輛過戶流程,但是這確實太浪費我得時間和精力了。我只是想買一輛車而已爲什麼我還要額外做這麼多事呢?於是我就通過中介公司來買車,他們來給我找車源,幫我辦理車輛過戶流程,我只是負責選擇自己喜歡的車,然後付錢就可以了。用圖表示如下: (買車這件事情還是要代理類親自來做的,但是買車過程中所要走的一些流程可以交由代理類來實現

   一個代理類可以代理多個被委託者或被代理者,因此一個代理類具體代理哪個具體主題角色,是由場景類決定的。最簡單的情況是一個主題類和一個代理類。通常情況下,一個接口只需要一個代理類,具體代理哪個實現類由高層模塊決定。


 

② 爲什麼要用代理模式?

  • 中介隔離作用
    • 在某些情況下,一個客戶類不想或者不能直接引用一個委託對象,而代理類對象可以在客戶類和委託對象之間起到中介的作用,其特徵是代理類和委託類實現相同的接口。
  • 開閉原則,增加功能
    • 代理類除了是客戶類和委託類的中介之外,我們還可以通過給代理類增加額外的功能來擴展委託類的功能,這樣做我們只需要修改代理類而不需要再修改委託類,符合代碼設計的開閉原則。
    • 代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後對返回結果的處理等。代理類本身並不真正實現服務,而是通過調用委託類的相關方法,來提供特定的服務。真正的業務功能還是由委託類來實現,但是可以在業務功能執行的前後加入一些公共的服務。例如我們想給項目加入緩存、日誌這些功能,我們就可以使用代理類來完成,而沒必要打開已經封裝好的委託類。

 

③ 代理模式的分類

代理模式分爲靜態代理、jdk動態代理、cglib動態代理。

  • 靜態代理:

靜態代理是最好理解的,涉及到一個接口、一個接口實現類、還有一個修飾這個接口實現類的代理類,分別對應着租房的動作,房東,中介三者的關係。

  • jdk動態代理

jdk代理模式雖然是動態代理,但是也算比較好理解,只要你的電腦有jdk就可以玩。

其實動態代理和靜態代理的思想是不變的,動態代理和靜態代理的區別就是,動態代理不用我們去手編寫代理類, 我們只需要編寫一個動態處理器就可以了。真正的代理對象由JDK在運行時爲我們動態的來創建。

  • CGLIB代理

第三方代理技術--Cglib代理。

JDK實現動態代理需要實現類通過接口定義業務方法,對於沒有接口的類,如何實現動態代理呢,這就需要CGLib了。

CGLIB代理可以對任何類生成代理,代理的原理是可以對目標對象接口實現代理,也可以進行繼承代理。

 

④ 代理模式的應用

    spring AOP的核心就是代理,通過代理模式的實現來實現解耦。

    AOP 專門用於處理系統中分佈於各個模塊(不同方法)中的交叉關注點的問題,在 Java EE 應用中,常常通過 AOP 來處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、緩存、對象池管理等,AOP 已經成爲一種非常常用的解決方案。

     AOP機制是 Spring 所提供的核心功能之一,其既是Java動態代理機制的經典應用,也是動態AOP實現的代表。Spring AOP默認使用Java動態代理來創建AOP代理,具體通過以下幾個步驟來完成:

  1. Spring IOC 容器創建Bean(目標類對象);

  2. Bean創建完成後,Bean後處理器(BeanPostProcessor)根據具體的切面邏輯及Bean本身使用Java動態代理技術生成代理對象;

  3. 應用程序使用上述生成的代理對象替代原對象來完成業務邏輯,從而達到增強處理的目的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章