連載34:軟件體系設計新方向:數學抽象、設計模式、系統架構與方案設計(簡化版)(袁曉河著)

註冊機制

 

一談到註冊機制,這個大家不是很陌生,因爲我們現行的戶口身份註冊制、企業工商註冊制度、股票中的註冊制等等都是一種註冊方式,其實我們經常都在處理這些繁瑣的註冊,但是在軟件開發中,我們就不大會用這種機制了,然而這種機制是讓代碼具有靈活性的最好方式。或者說是我們進行軟件解耦經常用的招數。Observer模式其實就是一個生動的例子。

C++實現多態的實現也是通過註冊機制進行的,下面我們簡要說明一下這種方式爲我們帶來的可擴展方面的意義,以及我們以後如果需要實現類似的東西該如何處理。

所謂多態就是同一種操作的不同的實現,C++多態是通過動態運行中,對函數指針的地址進行不同賦值,而達到多態實現。而這種方式也是一種註冊的方式,只是這個註冊需要編譯器完成機制,在運行時候才能完成。

通用的C++編譯器都常用如下的技術實現,如圖3-3所示:

 blob.png  圖3-3

當實現具體的繼承類,其類的成員函數的地址就會給&Fun1賦上。

下面我們看我們是如何應用這個註冊方式。

在系統中我們分爲上下兩個層次,而需要將上層作爲一個默認的實現,下層作爲一個可更換的實現,剛開始我就想是否通過函數的註冊看我們是如何通過註冊的方式進行中斷程序代碼的處理。

雖然,上面所見的註冊機制的應用都是基於動態方式進行,然而,註冊機制也體現在於靜態系統中,其實將一個類繼承加入到一個繼承體系中也是一種註冊的方式,而這種註冊的方式就是靜態的處理方式,只是靜態註冊方式與動態註冊方式存在一些不同之處,靜態註冊方式需要滿足接口和約束,在繼承一個接口和具體類的過程中,要求此類必須聲明和實現接口函數,並且限制其虛成員函數名稱、參數、返回值等都必須保存一致,滿足Liskov替換原則,子類必須能夠替換其基類等等,這樣就可以通過根據創建將其類對應的對象統一使用,並達到具體和抽象的統一。

彷彿註冊的只能出現在編碼過程,這絕對是一個誤解,對於註冊機制來說是在不同層次上進行不同方式的展現,例如對於一個龐大的系統來說,不是任何組件就一次到位,而是需要具有可拆卸的不同部件組成,而這些不同的可拆卸的部件就是一個個需要具有註冊和註銷功能的模塊,而只有這些具有可拆卸的部件,才能最終形成行業化,所以不要小看一個動態庫(dll),也許就是這樣的動態庫,增加了靈活性 ,也增加了產品的競爭力。試想一下,如果你正在開發一個系統,這個系統的某些組件不是一下子就能完成的,可能需要購買或者後續進行開發,但是如何滿足這些組件能夠合適的應用於你當前的系統,那麼你的骨幹就必須是一個具有註冊機制的體系,當部分組件完成後就可以組裝,當不需要的時候可以進行卸載。

所以上面可以看出,註冊機制其實是在滿足一定限制條件下,能夠進行靈活的註冊和註銷操作,並形成統一的特徵操作,讓使用者能夠通過集合化的方式進行訪問的一整套系統都可以統稱爲“註冊機制”。

通過上面的例子我們可以說明,註冊機制是解決耦合的最佳方式之一,是將發起者和執行者分離,在上面的註冊機制中其實我們還可以做很多處理,例如在統一註冊的地方我們設置安全策略進行安全方面的校驗,或者爲了提高速度進行不同方面的分發消息。是一對多的處理而不是一對全的處理。

VCL架構中其實是使用動態方法(dynamic method)來實現註冊處理,這類似於虛擬方法,但可減少虛函數列表大小,但執行效率比虛函數方法緩慢一點。

一些delphi的編譯器,會把經常調用的虛擬函數方法留在緩衝器中進一步提高執行效率,如圖3-4所示

 blob.png

 

3-4


註冊機制在架構中的廣泛應用,對於存在全局函數的接口,我們如何做到兼容,這裏使用註冊機制來幫組我們解決這個問題。

在前面我們看到的註冊的例子就是一個表驅動的例子,也就是說,可以通過使用表的數據結構代替我們的判斷操作。

但是並不僅僅只有表驅動才能達到效果,其實composite模式就是一個使用樹形結構代替算法處理,只是我們要將類也要看成一個數據結構。而且這種數據結構同時還帶有操作。

由此可以看出數據結構和算法是相互獨立,但是可以互換互補的兩種載體,有時候我們使用數據結構來代替算法的複雜性,有時候我們使用算法來代替數據結構的複雜性,這在架構設計的時候非常重要。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章