在前一篇簡要介紹了基於Flex的介面組合SDK,其中使用Hook機制實現UI Part生命週期管理、Master-Details關係構建和UI Part注入。Hook即鉤子,其作用可以理解為通過透明的方式為某一對象掛上額外的功能,從而實現透明擴充。Hook機制可以應用於各種平台,不限語言,其傳遞的是一種思想。利用Hook機制實現這些功能的最大優點是,在提供這些功能的同時不增加使用者複雜性,它能夠完全相容基於Flex組件的設計,使使用者絲毫感覺不出來我們正在使用SDK。也就是說,這種Hook機制的引入,該SDK提供的功能對開發人員是完全透明的,這個想法很酷。不過,沒有任何解決方案是完美的,這種Hook機制在資源釋放、事件捕捉時,需要按一定順序,控制這些順序對SDK維護人員要求比較高,一不注意,就會出現莫名其妙的錯誤。此外,Hook機制實現稍微困難一點。
是Hook機制實作類別圖。
IDisposable介面借鑒與微軟記憶體管理模型,Adobe Flex在記憶體管理和GC方面做得非常粗糙,其SDK記憶體流失很多,在模組化應用中,記憶體流失尤其嚴重。因此,我在設計該SDK的時候,引入了微軟的一些 記憶體管理思路,不過,根據需要做了一點變化。該SDK記憶體釋放分為2個階段,第一個階段有preDispose函數實現,用於釋放類執行個體間依賴,第二階段 是postDispose函數實現,用於釋放執行個體引用。所有的Hook都實現了IDisposable介面,可以實現記憶體釋放。
IComponentHook 繼承於IDisposable介面,定義了一個Hook的基本介面,由compositionManager、component、isHooked屬性 和hook、unHook方法組成,分別用於表示組合管理器、Hook掛載的組件、是否掛載和執行掛載、執行卸載。
ComponentHook是所有Hook基類,它直接實現了compositionManager、component、isHooked屬性的定義,並且在hook方法和unHook方法中設定了掛載的組件和isHooked屬性。
生命週期管理功能由IComponentLifecycleHook、IContainerLifecycleHook介面與 ComponentLifecycleHook、ContainerLifecycleHook、ViewStackLifecycleHook實作類別組成。ComponentLifecycleHook用於儲存一個葉子控制項的生命週期狀態,葉子控制項的生命週期是由其容器決定的;ContainerLifecycleHook用於儲存容器的生命週期狀態,同時用於管理子控制項的狀態,預設的,所有的子控制項都與容器的狀態是一致;ViewStack是一個特殊的容器,在任一時刻,它只顯示一個子控制項,ViewStackLifecycleHook用於儲存ViewStack容器的狀態,並管理當前顯示的控制項的狀態,當ViewStack狀態更改時,只更改當前被選中的子控制項,而其它子控制項都處於非啟用狀態。
SmartPartPlaceHolderHook和SmartPartContainerHook實現UI Part動態注入(在SDK中,每一個UI Part被命名為SmartPart,命名方式來源於微軟CAB)。這兩個Hook會為實現ISmartPartPlaceHolder和ISmartPartContainer介面的容器,從這類容器讀取location屬性,然後根據location屬性從SmartPartManager擷取相應的SmartPart,然後注入到這些容器中。SmartPartPlaceHolder與SmartPartContainer區別是,前者只能注入一個SmartPart,而後者可以注入多個SmartPart。
DetailsSmartPartHook實現Master-Details關係構建,為一個實現IDetailsSmartPart介面的組件添加其masterSmartPartLocations對應的MasterSmartPart,建立二者之間的關係,這種關係的建立對於用於是透明的。
ComponentTreeHook是Hook機制核心類,掛載到控制項樹的根節點,動態監聽整個控制項樹onChildAdded/Removed事件,實現整個控制項樹的所有Hook的建立和銷毀;DebugComponentTreeHook繼承於ComponentTreeHook,與其區別在於它是實現整個控制項樹調試資訊的收集,其收集的調試資訊能夠自動顯示到如下的DebugPanel。