層模式——面向模式體系結構學習筆記

熊貓夜未眠發表於2011-09-21

原文連結:enter link description here 作者:chgaowei

可以將系統劃分為子任務組,每個子任務組在一個特定的抽象層次上。

1. 例子

ISO7層模型。

2. 語境

一個需要分解的大系統

3. 問題

假設有一個系統,它明顯的混合了底層與高層的問題。

強制條件:

1) 一個地方的更改,被限制在某元件或某層內,不會擴散到整個系統。

2) 介面應該是穩定的,甚至可以用標準件來限定。

3) 系統的各個部分應該可以替換,元件可以被其他的實現方法來替換而不影響系統有的其他部分。則可能基於優秀的介面定義。

4) 以後可能有必要建立其他系統,這些系統具有和當前設計的系統具有同樣的底層問題。

5) 相似職責應該可以分組,以提高可理解性和可維護性。每個元件應該是內聚的(如何提高元件的內聚性?讓它只做自己的事情,不要越權。)

6) 沒有標準的元件粒度?為什麼?

7) 複雜元件需要進一步分解。是的,可以在元件內分解成子元件。如果還是太複雜,則可以考慮將它分成幾個層。

8) 跨元件邊界可能影響效能。

9) 在介面定義明確的情況下,系統可以由一個程式設計師組來建立。

4. 問題

將系統劃分為N層,從最低抽象層次開始,一直向上增加,直到第N層。

5. 問題

層模式的主要結構特徵是第J層的服務只被第J+1層使用——層之間沒有更進一步的依賴關係。每個獨立層都要防止較高層次直接訪問。

6. 動態特性

下面是各個場景:

1) 一個客戶端向層N傳送請求,但是層N無法完成服務,它需要呼叫N-1層的服務來完成這個服務。以此類推,N-1呼叫N-2N-2呼叫N-3……直到呼叫的最底層完成服務,然後向上反饋服務呼叫結果。這個描述的自頂向下的通訊。一個這樣的請求可能對應多個底層的服務呼叫。

2) 描述自底向上的通訊——一般是收到一個底層訊號,比如驅動檢查到有一個收到一個訊息,然後逐層向上傳輸。第一個一般稱為請求,這個可以成為通知。同樣,幾個通知可能會合成一個更高階的通知。

3) 請求或通知只需經過整個系統的一個子集。比如,層n-1可以提供服務。或者,底層的通知第2層就可以處理。

4) 包括兩個相互通訊的協議堆疊。

7. 實現

1) 為把任務分組而定義抽象準則。抽象準則確定有多少抽象層。

使用者可見元素

特定應用模組

公共服務層

作業系統介面層

作業系統

硬體

2) 根據抽象準則定義抽象層數。每個抽象層對應模式中的一個層。如果抽象層過於複雜,則可能要進一步分解。層數的控制:過少則少數層過於複雜,過多會導致不必要的開支。

3) 給每個層命名並制定他們的任務。要給他找一個好的,簡短的名字。如果你的名字很長,或者很難起名字,則可能說明你對這一層的思考不到位,這一層還需要進一步分解或者調整。要提高層的內聚性。如果採用自頂向下,則最高層是整個系統的功能,而其它層都是他的助手。

4) 指定服務。最重要的原則是層間要彼此嚴格分離。沒有一個元件跨越多於一個層。括號中的話理解不深(把較多的服務層放在高層比底層好。這是由於開發人員不用學習之友大量細微差別的原語,他們甚至可以在並行開發期間更。擴充套件高層以適合更寬廣的應用面,而基礎層保持細長。這種現象也稱為“逆向重用金字塔”)。

5) 細化分層。重複執行步驟1~4。這樣才可以獲得一個更好的層次結構。

6) 為每個層指定一個介面。儘量使用黑盒方法來——即J-1層對層J是黑盒,它只對外提供介面,而外面不知道它的內部結構和實現(其實也就是面向介面程式設計而非面向實現程式設計)。設計一個平展(flat)介面以提供所有層J服務,並可能把這些介面封裝在一個外觀(facade)物件之中。?(什麼是平展介面?是否是沒有層次關係的介面?

7) 構建獨立層。不但要設計合理的層間結構,層內部的結構也要合理。如果層過於負責,可以考慮將層分解為多個元件。如果還過於複雜,則要考慮生成一個新的層。元件的設計可以使用其他的模式優化。

8) 指定相鄰層間通訊。包括推模式,拉模式,以及回撥。

9) 分離鄰接層。這個沒有完全理解。往往高層關係相鄰的底層,底層不關心使用者的身份。這意味著只能單路連線:修改層J被改變了的服務的介面和語義保持穩定,層J中的改變可以忽略層J+1的存在和標識(我感覺這裡的翻譯有些問題。這裡的大意應該是,如果保持層J的介面不變(服務的介面和語義),這個時候,層J的更改可以忽略層J的存在。應該是這樣的分離。)。

對於自底向上的通訊,可以使用回撥函式且保留自頂向下的單路耦合。高層向底層註冊事件回撥函式(這個我使用過)。這個時候可以考慮使用反應器模式和命令模式。???不知道是翻譯的原有,文章的描述相當晦澀。明明一個很明確的東西,通常說的相當複雜。

10)           設計一種錯誤處理策略。對於層式體系結構來說,錯誤處理在處理時間和程式設計工作方面成本較大。錯誤處理一個原則:儘量底層處理。即便是要高層處理,也要轉化為更高層能夠理解的錯誤型別。另外,要減少錯誤型別,能合併的,儘量合併。

8. 以解決的例子

TCP/IP

9. 變體

1) 鬆散分層系統。層間沒有嚴格的約束。這種方案喪失了可維護性,得到的是靈活性和效能。這個要慎用。通常見於基礎結構中。

2) 通過繼承分層。底層作為基類實現,高層作為底層的一個子類,所以他可以向基類請求服務。優點是高層可以根據需要修改底層的服務。缺點是整合關係把高層與底層緊緊捆綁在一起。層間的耦合性增加。

10.          已知應用

1) 虛擬機器,在作業系統和硬體上增加了一個間接層。

2) API

3) 資訊系統,

11.          效果

優點:

1) 層的重用。如果一個獨立層體現了一個良好定義的抽象,並且有良好定義和文件化的介面,該層就可以在多個語境中重用。

2) 標準化支援。

3) 區域性依賴性。降低層發生更改對其他層的影響。

4) 可替換性。

不足:

1) 更改行為的重疊。一個改動可能要貫穿整個層次結構。

2) 降低效率。

3) 不必要的工作。

4) 難以認可層的正確粒度。層數過少不足以發揮這種模式的可重用性,可更改性,可移植性潛力。過多,則會引入不必要的複雜性和層間分離的冗餘。

相關文章