管道-過濾器模式是一種面向數據流的軟件體系結構。主要由管道和過濾器組成,過濾器爲一個具體的處理模塊,接受輸入數據而後進行必定的處理,最後進行輸出;管道是傳輸數據的組件,用於將數據從一個過濾器的輸出接口傳送到下一個過濾器的輸入接口。
管道-過濾器模式能夠很好地實現功能分解,經過將不一樣的功能用不一樣的過濾器進行實現,而後在用管道將各個過濾器相連,能夠很好地實現封裝與功能分解,利用管道-過濾器模式架構開發的軟件能夠很好地進行移植,提升了軟件模塊的重用性,同時也能夠方便地將某一箇舊過濾器用一個新過濾器進行更換,實現功能的修改或者更新,而不用修改軟件項目中其餘的過濾器。架構
管道-過濾器模式由兩大組件構成。一個爲過濾器,另外一個爲管道。
過濾器:主要功能爲從輸入接口中讀取數據,而後通過特定的處理,將結果數據置於輸出接口。過濾器是一個獨立的實體,只負責自身的處理,不用考慮其餘過濾器的輸入和輸出數據。過濾器分爲三類,分別爲輸入過濾器、處理過濾器和輸出過濾器。
管道:是鏈接各個過濾器的組件,負責過濾器間數據的傳輸,充當過濾器之間數據流的通道。性能
一個軟件的處理流程由多個複雜的過程組成,並且每一個處理過程依次執行,前一個處理爲後一個處理提供必要的數據,後一個過程須要前一個過程提供數據支持。每一個複雜的過程有本身獨特的處理邏輯,能夠對輸入數據所有進行處理,也能夠根據本身的特定狀況只對一部分數據進行處理,或者做出一些特定的動做,最後輸出最終的結果做爲軟件的執行結果。測試
軟件由多個複雜的處理流程組成,每一個處理有本身獨特的處理邏輯,流程不容易控制,每一個流程的輸出不容易獲得及時的反饋,編寫代碼較爲複雜,處理流程混亂,不容易造成體系結構,不容易進行任務的分解與分工,並且代碼不容易測試及維護。優化
採用管道-過濾器模式進行軟件體系結構的設計。軟件由多個獨立的處理劉才能組成,則將每一個處理流程當作一個過濾器,過濾器是由一個輸入接口、一個處理模塊和一個輸出接口組成,並且是一個獨立的實體。知足處理過程的獨立處理,接受輸入和輸出的要求。並且過濾器有本身的處理機制,能夠對全部的輸入都進行處理,還能夠對一部分數據進行處理,還能夠進行數據的檢測,當數據不知足要求時,能夠及時地作出迴應,進行錯誤處理。並且管道做爲數據的傳輸介質在過濾器之間進行數據的傳輸,很好地知足了流程的處理。同時在知足系統要求的狀況下很好地知足了代碼的分解,造成了不少獨立的過濾器模塊,使軟件代碼解耦合,作到了高內聚、低耦合的設計原則,因此很容易進行測試和維護,在某些過濾器須要替換或刪除時,能夠很好地進行操做,而不須要修改太多的代碼,並且也不會影響到其餘的過濾器,同時過濾器還能夠重用。提升了代碼的可重用性。因此經過應用管道-過濾器模式能夠很好地解決軟件須要進行流程處理的需求。設計
最典型的應用是編譯系統,編譯系統主要包括詞法分析器,語法分析器,語義分析與中間代碼生成器,優化器,目標代碼生成器等對源程序進行處理的過程。能夠將每一個處理過程看作一個過濾器,而後經過管道進行鏈接,而後就組成了一個編譯系統。
3d
如上圖所示源程序輸入到編譯系統,編譯系統先通過詞法分析過濾器,詞法分析過濾器讀取輸入的數據,而後進行詞法分析按詞法規則得出各種單詞,最後將分析得出的結果在輸出接口輸出;管道將該詞法分析結果傳送到語義分析過濾器,語義分析與中間代碼生成過濾器檢測程序代碼有無語義錯誤,沒有錯誤則生成中間代碼並輸出,如有錯則進行錯誤處理;而後再經管道將中間代碼傳送到優化器,…按照過濾器處理,管道進行數據傳送這種模式最終獲得編譯後的數據,這就是管道-過濾器的最典型的應用。blog