管道-過濾器模式

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

1.定義:web

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

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或者一個方法,前調用一個方法,或者在方法後調用一個方法好比動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者作其它業務邏輯的操做),也能夠在你調用方法後打印出字符串,甚至在你拋出異常的時候作業務邏輯的操做。

相關文章
相關標籤/搜索