管道與過濾器風格


     在管道/過濾器風格的軟件體系結構中,每個構件都有一組輸入和輸出,構件讀輸入的數據流,經過內部處理,然后產生輸出數據流。這個過程通常通過對輸入流的變換及增量計算來完成,所以在輸入被完全消費之前,輸出便產生了。因此,這里的構件被稱為過濾器,這種風格的連接件就象是數據流傳輸的管道,將一個過濾器的輸出傳到另一過濾器的輸入。此風格特別重要的過濾器必須是獨立的實體,它不能與其它的過濾器共享數據,而且一個過濾器不知道它上游和下游的標識。一個管道/過濾器網絡輸出的正確性並不依賴於過濾器進行增量計算過程的順序。


  如圖是管道/過濾器風格的示意圖。一個典型的管道/過濾器體系結構的例子是以Unix shell編寫的程序。Unix既提供一種符號,以連接各組成部分(Unix的進程),又提供某種進程運行時機制以實現管道。另一個著名的例子是傳統的編譯器。傳統的編譯器一直被認為是一種管道系統,在該系統中,一個階段(包括詞法分析、語法分析、語義分析和代碼生成)的輸出是另一個階段的輸入。

  管道/過濾器風格的軟件體系結構具有許多很好的特點:
  (1)使得軟構件具有良好的隱蔽性和高內聚、低耦合的特點;
  (2)允許設計者將整個系統的輸入/輸出行為看成是多個過濾器的行為的簡單合成;
  (3)支持軟件重用。重要提供適合在兩個過濾器之間傳送的數據,任何兩個過濾器都可被連接起來;
  (4)系統維護和增強系統性能簡單。新的過濾器可以添加到現有系統中來;舊的可以被改進的過濾器替換掉;
  (5)允許對一些如吞吐量、死鎖等屬性的分析;
  (6)支持並行執行。每個過濾器是作為一個單獨的任務完成,因此可與其它任務並行執行。 
  但是,這樣的系統也存在着若干不利因素。
  (1)通常導致進程成為批處理的結構。這是因為雖然過濾器可增量式地處理數據,但它們是獨立的,所以設計者必須將每個過濾器看成一個完整的從輸入到輸出的轉換。
  (2)不適合處理交互的應用。當需要增量地顯示改變時,這個問題尤為嚴重。
  (3)因為在數據傳輸上沒有通用的標准,每個過濾器都增加了解析和合成數據的工作,這樣就導致了系統性能下降,並增加了編寫過濾器的復雜性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM