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


靜態代理

  簡單來說就是:通過真實的實現類A和proxy代理實現同一個接口,然后在proxy代理里引入A對象的引用。

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

  優點:

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

  缺點:

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

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

 

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

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

 

動態代理:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM