组件设计实战--组件之间的关系 (Event、依赖倒置、Bridge)
??? 那么在設計組建之間的關系時到底該選擇那種方式,則需要依據實際情況而定。假設,組件A是信息提供者,而組件B是信息消費者。可以有以下幾種情況:
(1)A發布事件,B包含A的引用,然后B預定A的事件。(事件方式)
(2)B接口中提供接收信息的方法,A包含B的引用,在適當時候A調用B的接收信息的方法。(依賴倒置方式)
(3)A發布事件,B接口中提供接收信息的方法,通過Bridge將A、B聯系起來。(Bridge方式)
??? 下面舉個實際的例子,在我們的應用中,有個功能服務管理器IServiceManager(信息提供者),功能服務可以在運行的時候變化,這個變化可以被IServiceManager檢測到,而顯示功能服務名稱的IServiceDisplayer(信息消費者)也需要在功能服務變化的時候,將顯示作必要的改變。如果按照“事件”方式,應該如下設計:
??? public?interface?IServiceManager
????{
????????event?CbServiceAdded?ServiceAdded?;
????}
????public?delegate?void?CbServiceAdded(string?serviceName)?;
????public?interface?IServiceDisplayer
????{
????????IServiceManager?ServiceManager?;
????}
按照“依賴倒置”方式設計如下:
??? public?interface?IServiceManager
????{
????????IServiceDisplayer?ServiceDisplayer{set?;}
????}
????public?interface?IServiceDisplayer
????{
????????void?AddService(string?serviceName)?;
????}
按照“Bridge”方式設計如下:
??? public?interface?IServiceManager
????{
????????event?CbServiceAdded?ServiceAdded?;
????}
????public?delegate?void?CbServiceAdded(string?serviceName)?;
????public?interface?IServiceDisplayer
????{
????????void?AddService(string?serviceName)?;
????}
????public?interface?IServiceBridge
????{
????????IServiceManager???ServiceManager{set?;}
????????IServiceDisplayer?ServiceDisplayer{set?;}
????????void?Initialize();
????}
????public?class?ServiceBridge?:IServiceBridge
????{
????????private?IServiceManager???serviceManager?=?null?;
????????private?IServiceDisplayer?serviceDisplayer?=?null?;
????????#region?IServiceBridge?成員
????????public?void?Initialize()
????????{
????????????this.serviceManager.ServiceAdded?+=?new?CbServiceAdded(serviceManager_ServiceAdded);
????????}
????????public?IServiceManager?ServiceManager
????????{
????????????set
????????????{
????????????????this.serviceManager?=?value?;
????????????}
????????}
????????public?IServiceDisplayer?ServiceDisplayer
????????{
????????????set
????????????{
????????????????this.serviceDisplayer?=?value?;
????????????}
????????}
????????#endregion
????????private?void?serviceManager_ServiceAdded(string?serviceName)
????????{
????????????this.serviceDisplayer.AddService(serviceName)?;
????????}
????}
??? 三種方式都是可行的,但是在不同的應用情況下,不同的方式導致應用程序中組件之間不同的依賴復雜度,并對整個系統的結構的清晰度產生深刻的影響。那么,原則是什么?
(1)通常情況下,采用“事件”方式。
(2)如果使用“事件”方式時遇到這樣的情況:IServiceDisplayer預定的IServiceManager的那部分事件的預定者只有IServiceDisplayer,而不會有其它組件預定這部分事件,則可以考慮將這些事件從IServiceManager中移除,轉而采用“依賴倒置”方式。這樣做的好處是,大大減少了IServiceManager需要發布的事件的數量。
(3)如果IServiceDisplayer所需的信息不僅僅來自IServiceManager,還來自許多其它組件,則采用第三種方式。
(4)要謹慎使用“依賴倒置”方式,特別是當IServiceManager不需要從IServiceDisplayer獲取任何信息時,第二種方式會導致IServiceManager對IServiceManager的依賴,而這個依賴本來是不必要的。
(5)當一個(或多個)信息接受者需要從眾多的信息發布者獲取事件信息時,使用第三種方式是推薦的選擇。
??? 后續的文章會繼續對這三種方式作深刻的剖析,當然這要等我的認識進一步深化之后。“依賴倒置”這個名字是我取的,不知道是否有更正式的名稱,望告知:)
轉載于:https://www.cnblogs.com/zhuweisky/archive/2005/12/20/301098.html
總結
以上是生活随笔為你收集整理的组件设计实战--组件之间的关系 (Event、依赖倒置、Bridge)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录今天学习SQL遇到的一个小问题
- 下一篇: spring + hibernate