靜態代理:
簡單來說就是:通過真實的實現類A和proxy代理實現同一個接口,然后在proxy代理里引入A對象的引用。
這樣做的目的,就是為了可以實現一些其他的功能,但是不會讓真實類變得膨脹。
優點:
代理使客戶端不需要知道實現類是什么,怎么做的,而客戶端只需知道代理即可(解耦合),對於如上的客戶端代碼,newUserManagerImpl()可以應用工廠將它隱藏,如上只是舉個例子而已。
缺點:
1)代理類和委托類實現了相同的接口,代理類通過委托類實現了相同的方法。這樣就出現了大量的代碼重復。如果接口增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了代碼維護的復雜度。
2)代理對象只服務於一種類型的對象,如果要服務多類型的對象。勢必要為每一種對象都進行代理,靜態代理在程序規模稍大時就無法勝任了。如上的代碼是只為UserManager類的訪問提供了代理,但是如果還要為其他類如Department類提供代理的話,就需要我們再次添加代理Department的代理類。
舉例說明:代理可以對實現類進行統一的管理,如在調用具體實現類之前,需要打印日志等信息,這樣我們只需要添加一個代理類,在代理類中添加打印日志的功能,然后調用實現類,這樣就避免了修改具體實現類。滿足我們所說的開閉原則。但是如果想讓每個實現類都添加打印日志的功能的話,就需要添加多個代理類,以及代理類中各個方法都需要添加打印日志功能(如上的代理方法中刪除,修改,以及查詢都需要添加上打印日志的功能)
即靜態代理類只能為特定的接口(Service)服務。如想要為多個接口服務則需要建立很多個代理類。
動態代理:
動態代理,是在程序運行期間通過反射的機制生成