開箱即用,DynamicProxy提供了多種代理對象,主要分紅兩個大類:git
基於繼承(Inheritance-based)github
基於繼承的代理是經過繼承一個代理類來實現,代理攔截對類的虛(virtual)成員的調用並把它們轉發到基本實現,在這種狀況下,代理和被代理對象是一個,這也就意味着你不能爲一個已經存在的對象,建立基於繼承的代理.在DynamicProxy裏只有一種基於繼承的代理.代理
- 類代理(Class proxy) - 爲一個類建立一個基於繼承的代理,只有類的虛成員能被攔截.
基於整合(Composition-based)對象
基於整合代理是一個新的對象,它繼承於被代理的類/實現被代理的接口和(隨意地)轉發對目標對象的調用的攔截.DynamicProxy暴露了以下幾種基於整合的代理:繼承
- 有目標的類代理(Class proxy with target) - 這種代理指向類.它不是一個完美的代理,若是類沒有非虛成員或公開(public)成員就不能被攔截,它就會給用戶提供一個對象的不一致的狀態視圖,基於這個緣由,使用它時必定要當心.
- 無目標的代理接口(Interface proxy without target) - 這種代理指向接口.不須要爲它提供目標對象,相反地,該代理須要爲攔截器提供全部成員的實現.
- 有目標的代理接口(Interface proxy with target) - 顧名思義,包裝指定的接口的對象的實現,轉發對這些接口的調用到目標對象.
- 有目標接口的代理接口(Interface proxy with target interface) - 這是一種針對兩種不一樣接口合併的代理,能夠(但不是必須)爲它提供目標對象,也能夠爲它在生命週期裏交換目標對象.它不是被綁定在某個類型上的目標代理,因此它能夠複用在不一樣的類型上,只要這個類型實現了目標接口.
英文原文:https://github.com/castleproject/Core/blob/master/docs/dynamicproxy-kinds-of-proxy-objects.md接口