1. 程式人生 > >管道-過濾器模式

管道-過濾器模式

action alt input rcu nbsp 不依賴 圖表 連接 ice

今天我要介紹的是軟件體系結構模式中的管道-過濾器模式。

1.定義:

在管道和過濾器軟件體系結構中,每個模塊都有一組輸入和一組輸出。每個模塊從它的輸入端接收輸入數據流,在其內部經過處理後,按照標準的順序,將結果數據流送到輸出端,以達到傳遞一組完整的計算結果實例的目的。通常情況下,可以通過對輸入數據流進行局部變換,並采用漸增式計算方法,在未處理完所有輸入數據以前,就可以產生部分計算結果,並將其送到輸出端口(類似於流水線結構)。因此,稱這種模塊為“過濾器“。在這種結構中,各模塊之間的連接器充當了數據流的導管,將一個過濾器的輸出傳到下一個過濾器的輸入端。所以,這種連接器稱為“管道”。

2.組成

過濾器按照對流經它的數據操作的不同,可分為3類過濾器:輸入過濾器,處理過濾器和輸出過濾器。管道作為過濾器之間數據流動的通道的軟件部件,它的主要功能是連接各個過濾器,充當過濾器之間數據流的通道。

3.優點

(1)管道-過濾器模型有如下的優點: 設計人員將整個系統的輸入輸出行為理解為單個過濾器行為的疊加與組合。這樣可以將問題分解,化繁為簡。

(2)任何兩個過濾器,只要它們之間傳送的數據遵守共同的規約就可以相連接。每個過濾器都有自己獨立的輸入輸出接口,如果過濾器間傳輸的數據遵守其規約,只要用管道將它們連接就可以正常工作。?

(3)整個系統易於維護和升級:舊的過濾器可以被替代,新的過濾器可以添加到已有的系統上。軟件的易於維護和升級是衡量軟件系統質量的重要指標之一,在管道-過濾器模型中,只 要遵守輸入輸出數據規約,任何一個過濾器都可以被另一個新的過濾器代替,同時為增強程序功能,可以添加新的過濾器。這樣,系統的可維護性和可升級性得到了保證。

(4)支持並發執行:每個過濾器作為一個單獨的執行任務, 可以與其它過濾器並發執行。過濾器的執行是獨立的,不依賴於其它過濾器的。

和面向對象的對比:

面向對象的體系結構的一個明顯的缺點是:當一個對象通過過程調用與其它對象交互時,它必須知道其它對象的標識。而當一個對象的標識改變時,需要對所有調用這一方法的對象進行修改。而在管道(過濾器這種體系結構中,過濾器與其它過濾器相連接時不必知道系統中的其它過濾器。而且當某個過濾器發生改變時,不需要對其他過濾器進行改動。

4.在J2EE中的應用

Servlet 2. 3 提供的 Filter 是管道和過濾器體系構架在 J2EE中的具體應用。通過使用 Filter 為 Web 應用開發者能夠在請求到達 Web 資源前截取請求, 進行相應處理; 同理, 也能夠在請求資源反饋之前, 截取響應進行處理, 將處理後的結果反饋給客戶端。因此, Filter 為某些處理非常復雜的問題, 提供了很好的解決方案。Filter 的工作機制如圖 1 所示。

技術分享圖片

利用過濾器可以預處理請求的特性, 我們為信息服務平臺設計了一個網站訪問信息采集模塊, 用來跟蹤登錄網站用戶的一些基本信息, 如登錄 IP 地址、時間、訪問過的欄目、頁面及文章等, 為網站的訪問統計采集原始數據。

信息采集模塊由過濾器組件( rstFilter) 、監聽器組件( rst-Listener) 和用戶訪問信息組件( rstList) 三部分組成。信息采集過程主要在過濾器組件的 doFilter( ) 方法中進行采集, 並利用用戶信息組件暫存用戶訪問信息, 通過監聽器組件在會話銷毀時, 將用戶訪問信息存入數據庫, 以備統計。整個過程用 Rational Rose 的 Sequence 框圖表示, 如圖 2 所示。

技術分享圖片

另外, 利用 Filter 我們還可以實現以下功能:

( 1) 身份驗證和授權過濾器。在客戶端的請求響應之前,進行身份驗證和授權。

( 2) 加密解密過濾器。在客戶和服務器端, 實現加密和解密功能, 且只要更改過濾器就可以更改加密算法。

( 3) 壓縮和解壓縮過濾器。在客戶和服務器端, 實現壓縮和解壓縮功能。

( 4) 轉換過濾器。可根據客戶端的不同, 把相同內容轉換成不同的顯示方式展現給不同的用戶, 如手機用戶和 PC 機用戶瀏覽相同的網頁內容, 就需要根據客戶端瀏覽器的不同, 生成相應格式的數據, 發送給客戶端用戶。

( 5) 日誌記錄和審核過濾器。記錄客戶端發送的請求信息, 以度量資源的訪問量及網絡的傳輸量, 或執行訪問資源的限額。

5. 基於KWIC 的關鍵字匹配算法(管道+過濾器模式下實現)

思路:

每個過濾器處理數據,然後將結果送至下一個過濾器,。要有數據傳入,過濾器即開始工作。過濾器之間的數據共享被嚴格限制在管道傳輸

四個過濾器:

輸入(Input filter):

從數據源讀取輸入文件,解析格式,將行寫入輸出管道

移位(CircularShifter filter):循環移位

排序(Alphabetizer filter):

輸出(Output filter)

管道:

in_cs pipe

cs_al pipe

al_ou pile

具體代碼見:https://blog.csdn.net/l_f0rm4t3d/article/details/27183635

6.過濾器和攔截器的區別

過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字符集,或者去除掉一些非法字符

攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

管道-過濾器模式