1. 程式人生 > >關於動態代理和靜態代理的區別

關於動態代理和靜態代理的區別

靜態代理

  簡單來說就是:通過真實的實現類A和proxy代理實現同一個介面,然後在proxy代理裡引入A物件的引用。

  這樣做的目的,就是為了可以實現一些其他的功能,但是不會讓真實類變得膨脹。

  優點:

  代理使客戶端不需要知道實現類是什麼,怎麼做的,而客戶端只需知道代理即可(解耦合),對於如上的客戶端程式碼,newUserManagerImpl()可以應用工廠將它隱藏,如上只是舉個例子而已。

  缺點:

  1)代理類和委託類實現了相同的介面,代理類通過委託類實現了相同的方法。這樣就出現了大量的程式碼重複。如果介面增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了程式碼維護的複雜度。

  2)代理物件只服務於一種型別的物件,如果要服務多型別的物件。勢必要為每一種物件都進行代理,靜態代理在程式規模稍大時就無法勝任了。如上的程式碼是隻為UserManager類的訪問提供了代理,但是如果還要為其他類如Department類提供代理的話,就需要我們再次新增代理Department的代理類。

 

  舉例說明:代理可以對實現類進行統一的管理,如在呼叫具體實現類之前,需要列印日誌等資訊,這樣我們只需要新增一個代理類,在代理類中新增列印日誌的功能,然後呼叫實現類,這樣就避免了修改具體實現類。滿足我們所說的開閉原則。但是如果想讓每個實現類都新增列印日誌的功能的話,就需要新增多個代理類,以及代理類中各個方法都需要新增列印日誌功能(如上的代理方法中刪除,修改,以及查詢都需要新增上列印日誌的功能)

  即靜態代理類只能為特定的介面(Service)服務。如想要為多個介面服務則需要建立很多個代理類。

 

動態代理:

  動態代理,是在程式執行期間通過反射的機制生成