走在架構(gòu)師的大道上 Jack.Wang's home

          Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
                 對軟件體系結(jié)構(gòu)風(fēng)格的研究和實踐促進(jìn)了對設(shè)計的復(fù)用,一些經(jīng)過實踐證實的解決方案也可以可靠地用于解決新的問題。體系結(jié)構(gòu)風(fēng)格的不變部分使不同的系統(tǒng)可以共享同一個實現(xiàn)代碼。只要系統(tǒng)是使用常用的、規(guī)范的方法來組織,就可使別的設(shè)計者很容易地理解系統(tǒng)的體系結(jié)構(gòu)。例如,如果某人把系統(tǒng)描述為"客戶/服務(wù)器"模式,則不必給出設(shè)計細(xì)節(jié),我們立刻就會明白系統(tǒng)是如何組織和工作的。

            下面是Garlan和Shaw對通用體系結(jié)構(gòu)風(fēng)格的分類:
           ?。?)數(shù)據(jù)流風(fēng)格:批處理序列;管道/過濾器
           ?。?)調(diào)用/返回風(fēng)格:主程序/子程序;面向?qū)ο箫L(fēng)格;層次結(jié)構(gòu)
           ?。?)獨立構(gòu)件風(fēng)格:進(jìn)程通訊;事件系統(tǒng)
           ?。?)虛擬機風(fēng)格:解釋器;基于規(guī)則的系統(tǒng)
           ?。?)倉庫風(fēng)格:數(shù)據(jù)庫系統(tǒng);超文本系統(tǒng);黑板系統(tǒng)
            限于篇幅,在本文中,我們將只介紹幾種主要的和經(jīng)典的體系結(jié)構(gòu)風(fēng)格和它們的優(yōu)缺點。有關(guān)新出現(xiàn)的軟件體系結(jié)構(gòu)風(fēng)格,將在后續(xù)文章中進(jìn)行介紹。

          1、C2風(fēng)格

            C2體系結(jié)構(gòu)風(fēng)格可以概括為:通過連接件綁定在一起的按照一組規(guī)則運作的并行構(gòu)件網(wǎng)絡(luò)。C2風(fēng)格中的系統(tǒng)組織規(guī)則如下:
           ?。?)系統(tǒng)中的構(gòu)件和連接件都有一個頂部和一個底部;
           ?。?)構(gòu)件的頂部應(yīng)連接到某連接件的底部,構(gòu)件的底部則應(yīng)連接到某連接件的頂部,而構(gòu)件與構(gòu)件之間的直接連接是不允許的;
           ?。?)一個連接件可以和任意數(shù)目的其它構(gòu)件和連接件連接;
            (4)當(dāng)兩個連接件進(jìn)行直接連接時,必須由其中一個的底部到另一個的頂部。

            圖3是C2風(fēng)格的示意圖。圖中構(gòu)件與連接件之間的連接體現(xiàn)了C2風(fēng)格中構(gòu)建系統(tǒng)的規(guī)則。


           
          圖3 C2風(fēng)格的體系結(jié)構(gòu)

            C2風(fēng)格是最常用的一種軟件體系結(jié)構(gòu)風(fēng)格。從C2風(fēng)格的組織規(guī)則和結(jié)構(gòu)圖中,我們可以得出,C2風(fēng)格具有以下特點:
           ?。?)系統(tǒng)中的構(gòu)件可實現(xiàn)應(yīng)用需求,并能將任意復(fù)雜度的功能封裝在一起;
           ?。?)所有構(gòu)件之間的通訊是通過以連接件為中介的異步消息交換機制來實現(xiàn)的;
           ?。?)構(gòu)件相對獨立,構(gòu)件之間依賴性較少。系統(tǒng)中不存在某些構(gòu)件將在同一地址空間內(nèi)執(zhí)行,或某些構(gòu)件共享特定控制線程之類的相關(guān)性假設(shè)。

          2、管道/過濾器風(fēng)格

            在管道/過濾器風(fēng)格的軟件體系結(jié)構(gòu)中,每個構(gòu)件都有一組輸入和輸出,構(gòu)件讀輸入的數(shù)據(jù)流,經(jīng)過內(nèi)部處理,然后產(chǎn)生輸出數(shù)據(jù)流。這個過程通常通過對輸入流的變換及增量計算來完成,所以在輸入被完全消費之前,輸出便產(chǎn)生了。因此,這里的構(gòu)件被稱為過濾器,這種風(fēng)格的連接件就象是數(shù)據(jù)流傳輸?shù)墓艿溃瑢⒁粋€過濾器的輸出傳到另一過濾器的輸入。此風(fēng)格特別重要的過濾器必須是獨立的實體,它不能與其它的過濾器共享數(shù)據(jù),而且一個過濾器不知道它上游和下游的標(biāo)識。一個管道/過濾器網(wǎng)絡(luò)輸出的正確性并不依賴于過濾器進(jìn)行增量計算過程的順序。

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


          圖4 管道/過濾器風(fēng)格的體系結(jié)構(gòu)

            管道/過濾器風(fēng)格的軟件體系結(jié)構(gòu)具有許多很好的特點:
            (1)使得軟構(gòu)件具有良好的隱蔽性和高內(nèi)聚、低耦合的特點;
           ?。?)允許設(shè)計者將整個系統(tǒng)的輸入/輸出行為看成是多個過濾器的行為的簡單合成;
           ?。?)支持軟件重用。重要提供適合在兩個過濾器之間傳送的數(shù)據(jù),任何兩個過濾器都可被連接起來;
           ?。?)系統(tǒng)維護(hù)和增強系統(tǒng)性能簡單。新的過濾器可以添加到現(xiàn)有系統(tǒng)中來;舊的可以被改進(jìn)的過濾器替換掉;
            (5)允許對一些如吞吐量、死鎖等屬性的分析;
           ?。?)支持并行執(zhí)行。每個過濾器是作為一個單獨的任務(wù)完成,因此可與其它任務(wù)并行執(zhí)行。

            但是,這樣的系統(tǒng)也存在著若干不利因素。

           ?。?)通常導(dǎo)致進(jìn)程成為批處理的結(jié)構(gòu)。這是因為雖然過濾器可增量式地處理數(shù)據(jù),但它們是獨立的,所以設(shè)計者必須將每個過濾器看成一個完整的從輸入到輸出的轉(zhuǎn)換。
           ?。?)不適合處理交互的應(yīng)用。當(dāng)需要增量地顯示改變時,這個問題尤為嚴(yán)重。
           ?。?)因為在數(shù)據(jù)傳輸上沒有通用的標(biāo)準(zhǔn),每個過濾器都增加了解析和合成數(shù)據(jù)的工作,這樣就導(dǎo)致了系統(tǒng)性能下降,并增加了編寫過濾器的復(fù)雜性。

          3、數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格

            抽象數(shù)據(jù)類型概念對軟件系統(tǒng)有著重要作用,目前軟件界已普遍轉(zhuǎn)向使用面向?qū)ο笙到y(tǒng)。這種風(fēng)格建立在數(shù)據(jù)抽象和面向?qū)ο蟮幕A(chǔ)上,數(shù)據(jù)的表示方法和它們的相應(yīng)操作封裝在一個抽象數(shù)據(jù)類型或?qū)ο笾?。這種風(fēng)格的構(gòu)件是對象,或者說是抽象數(shù)據(jù)類型的實例。對象是一種被稱作管理者的構(gòu)件,因為它負(fù)責(zé)保持資源的完整性。對象是通過函數(shù)和過程的調(diào)用來交互的。

            圖5是數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格的示意圖。
           


          圖5 數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格的體系結(jié)構(gòu)

            面向?qū)ο蟮南到y(tǒng)有許多的優(yōu)點,并早已為人所知:

           ?。?)因為對象對其它對象隱藏它的表示,所以可以改變一個對象的表示,而不影響其它的對象。
            (2)設(shè)計者可將一些數(shù)據(jù)存取操作的問題分解成一些交互的代理程序的集合。

            但是,面向?qū)ο蟮南到y(tǒng)也存在著某些問題:

           ?。?)為了使一個對象和另一個對象通過過程調(diào)用等進(jìn)行交互,必須知道對象的標(biāo)識。只要一個對象的標(biāo)識改變了,就必須修改所有其他明確調(diào)用它的對象。
           ?。?)必須修改所有顯式調(diào)用它的其它對象,并消除由此帶來的一些副作用。例如,如果A使用了對象B,C也使用了對象B,那么,C對B的使用所造成的對A的影響可能是料想不到的。

          4、基于事件的隱式調(diào)用風(fēng)格

            基于事件的隱式調(diào)用風(fēng)格的思想是構(gòu)件不直接調(diào)用一個過程,而是觸發(fā)或廣播一個或多個事件。系統(tǒng)中的其它構(gòu)件中的過程在一個或多個事件中注冊,當(dāng)一個事件被觸發(fā),系統(tǒng)自動調(diào)用在這個事件中注冊的所有過程,這樣,一個事件的觸發(fā)就導(dǎo)致了另一模塊中的過程的調(diào)用。

            從體系結(jié)構(gòu)上說,這種風(fēng)格的構(gòu)件是一些模塊,這些模塊既可以是一些過程,又可以是一些事件的集合。過程可以用通用的方式調(diào)用,也可以在系統(tǒng)事件中注冊一些過程,當(dāng)發(fā)生這些事件時,過程被調(diào)用。

            基于事件的隱式調(diào)用風(fēng)格的主要特點是事件的觸發(fā)者并不知道哪些構(gòu)件會被這些事件影響。這樣不能假定構(gòu)件的處理順序,甚至不知道哪些過程會被調(diào)用,因此,許多隱式調(diào)用的系統(tǒng)也包含顯式調(diào)用作為構(gòu)件交互的補充形式。

            支持基于事件的隱式調(diào)用的應(yīng)用系統(tǒng)很多。例如,在編程環(huán)境中用于集成各種工具,在數(shù)據(jù)庫管理系統(tǒng)中確保數(shù)據(jù)的一致性約束,在用戶界面系統(tǒng)中管理數(shù)據(jù),以及在編輯器中支持語法檢查。例如在某系統(tǒng)中,編輯器和變量監(jiān)視器可以登記相應(yīng)Debugger的斷點事件。當(dāng)Debugger在斷點處停下時,它聲明該事件,由系統(tǒng)自動調(diào)用處理程序,如編輯程序可以卷屏到斷點,變量監(jiān)視器刷新變量數(shù)值。而Debugger本身只聲明事件,并不關(guān)心哪些過程會啟動,也不關(guān)心這些過程做什么處理。

            隱式調(diào)用系統(tǒng)的主要優(yōu)點有:

            (1)為軟件重用提供了強大的支持。當(dāng)需要將一個構(gòu)件加入現(xiàn)存系統(tǒng)中時,只需將它注冊到系統(tǒng)的事件中。
            (2)為改進(jìn)系統(tǒng)帶來了方便。當(dāng)用一個構(gòu)件代替另一個構(gòu)件時,不會影響到其它構(gòu)件的接口。
            隱式調(diào)用系統(tǒng)的主要缺點有:
           ?。?)構(gòu)件放棄了對系統(tǒng)計算的控制。一個構(gòu)件觸發(fā)一個事件時,不能確定其它構(gòu)件是否會響應(yīng)它。而且即使它知道事件注冊了哪些構(gòu)件的構(gòu)成,它也不能保證這些過程被 調(diào)用的順序。
            (2)數(shù)據(jù)交換的問題。有時數(shù)據(jù)可被一個事件傳遞,但另一些情況下,基于事件的系統(tǒng)必須依靠一個共享的倉庫進(jìn)行交互。在這些情況下,全局性能和資源管理便成了問題。
           ?。?)既然過程的語義必須依賴于被觸發(fā)事件的上下文約束,關(guān)于正確性的推理存在問題。

          5、層次系統(tǒng)風(fēng)格

            層次系統(tǒng)組織成一個層次結(jié)構(gòu),每一層為上層服務(wù),并作為下層客戶。在一些層次系統(tǒng)中,除了一些精心挑選的輸出函數(shù)外,內(nèi)部的層只對相鄰的層可見。這樣的系統(tǒng)中構(gòu)件在一些層實現(xiàn)了虛擬機(在另一些層次系統(tǒng)中層是部分不透明的)。連接件通過決定層間如何交互的協(xié)議來定義,拓?fù)浼s束包括對相鄰層間交互的約束。

            這種風(fēng)格支持基于可增加抽象層的設(shè)計。這樣,允許將一個復(fù)雜問題分解成一個增量步驟序列的實現(xiàn)。由于每一層最多只影響兩層,同時只要給相鄰層提供相同的接口,允許每層用不同的方法實現(xiàn),同樣為軟件重用提供了強大的支持。

            圖6是層次系統(tǒng)風(fēng)格的示意圖。層次系統(tǒng)最廣泛的應(yīng)用是分層通信協(xié)議。在這一應(yīng)用領(lǐng)域中,每一層提供一個抽象的功能,作為上層通信的基礎(chǔ)。較低的層次定義低層的交互,最低層通常只定義硬件物理連接。

          圖6 層次系統(tǒng)風(fēng)格的體系結(jié)構(gòu)

            層次系統(tǒng)有許多可取的屬性:

           ?。?)支持基于抽象程度遞增的系統(tǒng)設(shè)計,使設(shè)計者可以把一個復(fù)雜系統(tǒng)按遞增的步驟進(jìn)行分解;
            (2)支持功能增強,因為每一層至多和相鄰的上下層交互,因此功能的改變最多影響相鄰的上下層;
           ?。?)支持重用。只要提供的服務(wù)接口定義不變,同一層的不同實現(xiàn)可以交換使用。這樣,就可以定義一組標(biāo)準(zhǔn)的接口,而允許各種不同的實現(xiàn)方法。
            但是,層次系統(tǒng)也有其不足之處:
           ?。?)并不是每個系統(tǒng)都可以很容易地劃分為分層的模式,甚至即使一個系統(tǒng)的邏輯結(jié)構(gòu)是層次化的,出于對系統(tǒng)性能的考慮,系統(tǒng)設(shè)計師不得不把一些低級或高級的功能綜合起來;
           ?。?)很難找到一個合適的、正確的層次抽象方法。

          6、倉庫風(fēng)格

            在倉庫風(fēng)格中,有兩種不同的構(gòu)件:中央數(shù)據(jù)結(jié)構(gòu)說明當(dāng)前狀態(tài),獨立構(gòu)件在中央數(shù)據(jù)存貯上執(zhí)行,倉庫與外構(gòu)件間的相互作用在系統(tǒng)中會有大的變化。

            控制原則的選取產(chǎn)生兩個主要的子類。若輸入流中某類時間觸發(fā)進(jìn)程執(zhí)行的選擇,則倉庫是一傳統(tǒng)型數(shù)據(jù)庫;另一方面,若中央數(shù)據(jù)結(jié)構(gòu)的當(dāng)前狀態(tài)觸發(fā)進(jìn)程執(zhí)行的選擇,則倉庫是一黑板系統(tǒng)。

            圖7是黑板系統(tǒng)的組成。黑板系統(tǒng)的傳統(tǒng)應(yīng)用是信號處理領(lǐng)域,如語音和模式識別。另一應(yīng)用是松耦合代理數(shù)據(jù)共享存取。

          圖7 黑板系統(tǒng)的組成

            我們從圖4中可以看出,黑板系統(tǒng)主要由三部分組成:

            (1)知識源。知識源中包含獨立的、與應(yīng)用程序相關(guān)的知識,知識源之間不直接進(jìn)行通訊,它們之間的交互只通過黑板來完成。
           ?。?)黑板數(shù)據(jù)結(jié)構(gòu)。黑板數(shù)據(jù)是按照與應(yīng)用程序相關(guān)的層次來組織的解決問題的數(shù)據(jù),知識源通過不斷地改變黑板數(shù)據(jù)來解決問題。
           ?。?)控制。控制完全由黑板的狀態(tài)驅(qū)動,黑板狀態(tài)的改變決定使用的特定知識。





          本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。
          posted on 2008-09-16 10:26 Jack.Wang 閱讀(2071) 評論(0)  編輯  收藏 所屬分類: 架構(gòu)師篇
          主站蜘蛛池模板: 习水县| 汉中市| 恭城| 化隆| 社会| 康马县| 霍林郭勒市| 峡江县| 芷江| 大竹县| 山西省| 个旧市| 峨边| 台中县| 广南县| 高邑县| 小金县| 凤城市| 巴里| 苗栗市| 泸西县| 屯门区| 普安县| 宜兰县| 茂名市| 循化| 资阳市| 樟树市| 嘉祥县| 青海省| 栾川县| 石林| 侯马市| 文昌市| 西城区| 和政县| 孙吴县| 颍上县| 泰安市| 蕉岭县| 株洲县|