模式是軟件開發(fā)實踐智慧的結(jié)晶,它作為一種理論反過來對軟件的開發(fā)又起著指導(dǎo)作用。根據(jù)軟件開發(fā)的階段以及開發(fā)的粒度,模式可分為:體系結(jié)構(gòu)模式、設(shè)計模式和慣用法?1。而本文的管道和過濾器模式是體系結(jié)構(gòu)模式中的一種
1 主要的特征是:
(1)為處理數(shù)據(jù)的系統(tǒng)提供了一種結(jié)構(gòu);
(2)每個處理步驟封裝在一個過濾器組件中,每個過濾器可以單獨修改,其功能單一;
(3)數(shù)據(jù)通過相鄰過濾器之間的管道傳輸;
(4)重組過濾器可以建立相關(guān)的系統(tǒng)族;
(5)過濾器是獨立運(yùn)行的部件:
①每個過濾器除了輸入和輸出外,受了壬何其他過濾器運(yùn)行的影響。也就是,在設(shè)計上過濾器之間不共享任何狀態(tài)信息;
?、谝粋€過濾器對其處理的上游和下游連接的過濾器是“無知”的;獨立性還表現(xiàn)在它的設(shè)計和使用不對與其連接的任何過濾器施加限制,唯一關(guān)心的是其輸人數(shù)據(jù),然后進(jìn)行加工處理,最后產(chǎn)生數(shù)據(jù)輸出。該模式應(yīng)用的基本特點是:把系統(tǒng)任務(wù)分成幾個相連的處理步驟,一步驟的輸出是一步驟的輸入,而且數(shù)據(jù)的處理和控制并發(fā)進(jìn)行。目前典型的管道過濾器體系結(jié)構(gòu)的例子是以Unix sheu編寫的程序。Unix既提供一種符號,以連接各組成部分(Unix的進(jìn)程),又提供某種進(jìn)程運(yùn)行時機(jī)制以實現(xiàn)管道。另一個著名的例子是傳統(tǒng)的編譯器。傳統(tǒng)的編譯器一直被認(rèn)為是一種管道系統(tǒng),在該系統(tǒng)中,一個階段(包括詞法分析、語法分析、語義分析和代碼生成)的輸出是另一個階段的輸入。
2 問題
在處理數(shù)據(jù)流的語境中,建立一個必須處理或轉(zhuǎn)換輸入數(shù)據(jù)流的系統(tǒng)。這樣的系統(tǒng)需要滿足以下強(qiáng)制條件:對數(shù)據(jù)的處理可以容易地分成幾個處理步驟;操作順序精確一致;數(shù)據(jù)順序精確一致;處理并行性;系統(tǒng)的升級可以通過替換/增an/重組處理步驟實現(xiàn),有時甚至由使用者完成操作;不同的處理步驟不共享信息;存在不同的輸人數(shù)據(jù)源;負(fù)載要求盡可能的平衡。在該系統(tǒng)中可進(jìn)一步細(xì)分如下四種:(1)將系統(tǒng)任務(wù)分成幾個順序的處理步驟,這些步驟之間通過數(shù)據(jù)流連接,每個步驟稱為過濾器。(2)系統(tǒng)的輸人由諸如文本文件,或者其他的數(shù)據(jù)源提供。(3)系統(tǒng)的輸出流人數(shù)據(jù)匯點。(4)管道連接數(shù)據(jù)源、過濾器和數(shù)據(jù)匯點,它負(fù)責(zé)實現(xiàn)相鄰步驟之間的數(shù)據(jù)流動。
3 系統(tǒng)用到的四種數(shù)據(jù)結(jié)構(gòu)
3.1過濾器結(jié)構(gòu)
過濾器是流水線的處理單元,負(fù)責(zé)豐富,提煉或轉(zhuǎn)換它的輸人數(shù)據(jù),如圖1所示。它以下面的三種方式工作:隨后的流水線單元從過濾器中拉出數(shù)據(jù)(被動過濾器);前面的流水線單元把新的輸人數(shù)據(jù)壓人過濾器(被動過濾器);過濾器以循環(huán)的方式工作,從流水線中拉出輸人數(shù)據(jù)并且將其輸出數(shù)據(jù)壓人流水線(主動過濾器)。
3.2管道結(jié)構(gòu)
管道表示過濾器之間的連接;數(shù)據(jù)源和第一個過濾器之間的連接;以及最后的過濾器和數(shù)據(jù)匯點之間的連接。如果管道連接兩個主動過濾器,那么管道需要進(jìn)行緩沖和同步,如圖2所示。如果兩個主動組件是由管道中的某個過濾器控制,那么管道可以直接調(diào)用來實現(xiàn)。但是,直接的調(diào)用將使得過濾器的重組更加困難。
數(shù)據(jù)源表示系統(tǒng)的輸人,它提供一系列相同結(jié)構(gòu)或類型的值,如圖3所示。流水線的數(shù)據(jù)源可以主動地把數(shù)據(jù)值推人第一個處理階段,也可以在第一個過濾器拉出時被動地提供數(shù)據(jù)。
3.4數(shù)據(jù)匯點
數(shù)據(jù)匯點收集來自流水線端的結(jié)果,如圖4所示。其工作方式有兩種:主動數(shù)據(jù)匯點把前面處理階段的結(jié)果拉出來;被動數(shù)據(jù)匯點允許前面的過濾器把結(jié)果推或?qū)戇M(jìn)出。
4 管道和過濾器模式的動態(tài)特性
流水線規(guī)定了數(shù)據(jù)流的流動方向,但是其控制流根據(jù)不同的情況可以有多種方式。具體到確定控制流,可以根據(jù)實際的系統(tǒng)中有哪些主動組件來確定。以下是動態(tài)特性的四種場景(其中n和f2是計算函數(shù))。
場景1:推進(jìn)流水線,其活動從數(shù)據(jù)源開始,每個過濾器是被動的過濾器。如圖5所示:
場景2:拉出流水線,其活動從數(shù)據(jù)匯點開始,每個過濾器是主動過濾器。如圖6所示。
場景3:推一拉流水線,其活動從第二個過濾器開始。如圖7所示:
場景4:典型的管道個過濾器系統(tǒng),所有的過濾器都循環(huán)主動拉出、計算并推人數(shù)據(jù)。在這種情況下,每個過濾器以它自己的控制線程運(yùn)行,過濾器之間利用管道進(jìn)行同步。如圖8所示:
5 實現(xiàn)方案
5.1將系統(tǒng)任務(wù)分成一系列處理階段
(1)每個階段必須只依賴前一階段的輸出。
(2)需要注意替換處理步驟時的方法:重新設(shè)計時替換;運(yùn)行時刻替換;安裝后進(jìn)行替換。
5.2定義沿每個管道傳輸?shù)臄?shù)據(jù)格式
(1)定義一個統(tǒng)一的格式可以獲得最大的靈活性,但是可能帶來效率問題。
(2)必須定義如何標(biāo)識輸人結(jié)束:0值,一1值等。
(3)可能需要有其他的語義控制標(biāo)志:比如數(shù)據(jù)幀結(jié)束,數(shù)據(jù)異常標(biāo)志等。
5.3決定如何實現(xiàn)每個管道連接
(1)確定每個過濾器是被動的還是主動的。
(2)定義每個過濾器的數(shù)據(jù)是由壓人數(shù)據(jù)還是由拉出數(shù)據(jù)啟動的。
(3)定義數(shù)據(jù)如何傳遞:通過直接調(diào)用;通過分離的管道機(jī)制進(jìn)行緩沖和同步;同時,使用相同的管道機(jī)制使得過濾器重組更加容易。
5.4設(shè)計和實現(xiàn)過濾器
(1)基于過濾器需要完成的任務(wù),相鄰的管道來設(shè)計過濾器。
(2)考慮地址空間之間拷貝數(shù)據(jù)的需要。
(3)考慮管道緩沖區(qū)大小。
(4)考慮重用過濾器,能夠按照特定的方式控制他們的行為:從哪個管道讀取數(shù)據(jù)?向那個管道輸送數(shù)據(jù)?
5.5設(shè)計出錯處理
(1)錯誤處理很難做到,往往被忽略。
(2)如果一個過濾器在其輸人數(shù)據(jù)中探測到錯:它可以忽略輸入,直到一些清楚的分隔符出現(xiàn);停止處理,重置狀態(tài),等待某個特定的開始符號出現(xiàn)。
(3)很難給出處理錯誤的一般策略。
5.6考慮管道的動態(tài)重組
(1)當(dāng)需要重組過濾器的時候,首先要考慮在什么時候可以進(jìn)行動態(tài)重組?
(2)如何重新定向過濾器的輸人和輸出?
(3)由誰啟動?是否在輸人數(shù)據(jù)流中增加控制符號?
6 管道和過濾器的一個應(yīng)用實例
假若要開發(fā)這樣的軟件:汽車牌照識別系統(tǒng)[引。該系統(tǒng)一般可順序地分為車輛圖像獲取、車輛牌照子圖像定位與分割、字符識別。流程如圖9所示:
由于系統(tǒng)任務(wù)分成幾個順序的處理步驟,這些步驟之間通過數(shù)據(jù)流連接,而且前一步驟的輸出是下一步驟的輸人,如圖10。因而開發(fā)整個系統(tǒng)可應(yīng)用管道和過濾器模式。整個系統(tǒng)不僅如此,每一個步驟也具有該特征。該系統(tǒng)的關(guān)鍵步驟是上圖的第一和第二兩個方框圖,并且第二個框圖的開發(fā)質(zhì)量直接影響到第三個框圖?,F(xiàn)在用管道和過濾器模式來開發(fā)第二個方框圖的牌照子圖像的定位。相應(yīng)的對象建模圖可設(shè)計成圖1 1:
該對象建模圖出現(xiàn)的場景如下[ ]:
· 彩色位圖的輸人是通過視頻捕獲到的24位真彩色圖。
· 為了便于對圖像的處理,將彩色圖進(jìn)行灰度化形成8位的灰度圖。這可采用主動過濾器來調(diào)用LoadBitMap()函數(shù)得到灰度化的數(shù)據(jù)流。灰度化可以采用現(xiàn)行標(biāo)準(zhǔn)的平均值算法g=0.3R+0.59G+0.1lB。(g:表示灰度化后的值,R、G、B表示紅綠藍(lán)三元色)
· 由于得到的圖像一般有一些缺陷,例如成像時光線不足,使得整幅圖偏暗,或者成像時光照過強(qiáng),使得整幅圖偏亮,從而造成圖像的對比度偏低,這就需要進(jìn)行灰度拉伸?;叶壤炜稍O(shè)計成主動過濾器,來調(diào)用灰度化函數(shù)ColorTransGray()來作為自己的數(shù)據(jù)輸人。
· 邊緣提取也可采用主動過濾器,調(diào)用灰度拉伸函數(shù)GrayStreteh()作為自己的數(shù)據(jù)輸人。其算法可用RoberDIB,SobelDIB,Prewitt中的一種,產(chǎn)生的是邊緣幅度圖像,用Hough變換提取直線的算法進(jìn)一步來補(bǔ)充產(chǎn)生的邊緣幅度圖像。
· 模板匹配可設(shè)計成Pull和Push過濾器,一方面它將邊緣提取函數(shù)的輸出作為自己的數(shù)據(jù)流輸人,通過調(diào)用邊緣提取函數(shù)來完成。另一方面將模板匹配計算的結(jié)果壓人管道進(jìn)行緩存。
· 驗證并輸出圖像對象讀取管道中的數(shù)據(jù),調(diào)用CoutImage()函數(shù)輸出字符分割對象。
7 效果
7.1管道和過濾器模式有許多優(yōu)點
可通過組件的重組和重用來創(chuàng)建新的處理流水線,例如在實例中,汽車牌照定位系統(tǒng)是一個沒有數(shù)據(jù)匯點的處理流水線,將它加人到字符分割識別處理流水線中,在加上前面的圖像的獲取形成一個新的處理流水線一汽車牌照識別系統(tǒng)。也就是說管道和過濾器的重組和重用的特性增加了軟件開發(fā)的靈活性。處理數(shù)據(jù)流不一定需要中問文件,這是管道和過濾器的又一個優(yōu)點。在一個把中間結(jié)果放在文件中的系統(tǒng),文件目錄的安排策略是不容易的。而且在每次運(yùn)行系統(tǒng)時不得不重新建立處理步驟,這種方法是易出錯的。
7.2管道和過濾器模式也有它自己的不足
第一,不相連的處理步驟不共享信息。假如該模式有大量的共享全局?jǐn)?shù)據(jù),那么用該模式建立的系統(tǒng)不僅不夠靈活,而且還很昂貴。第二,對所有過濾器的輸人和輸出使用單數(shù)據(jù)格式增加了數(shù)據(jù)轉(zhuǎn)換的額外開銷。第三,錯誤恢復(fù)和錯誤處理策略難以實現(xiàn)。
8 結(jié)束語
本文只討論了管道和過濾器模式,它只是許多模式中的一種。模式覆蓋了軟件開發(fā)的各個方面,根據(jù)不同的應(yīng)用應(yīng)選擇不同的模式,或者多種模式同時并存。例如用代理者模式、微核模式、管道和過濾器模式來開發(fā)分布式系統(tǒng),用M—A—V模式和P—A—V模式來開發(fā)交互式系統(tǒng),用映像模式和微核模式來開發(fā)適應(yīng)式系統(tǒng),等等,這樣形成了模式系統(tǒng)_1 J。特別在軟件開發(fā)的過程當(dāng)中,要利用我們的經(jīng)驗和智慧來開發(fā)挖掘模式、組織模式和利用模式,在軟件開發(fā)中發(fā)揮指導(dǎo)作用。
標(biāo)簽:
相關(guān)技術(shù)