過去了三周,終于有機(jī)會把之前落下的周記補(bǔ)上舅踪。這周的架構(gòu)師學(xué)習(xí)周記,主要整理了關(guān)于軟件架構(gòu)風(fēng)格的相關(guān)知識。
1、什么是軟件架構(gòu)風(fēng)格
軟件架構(gòu)風(fēng)格就是描述某一特定應(yīng)用領(lǐng)域中系統(tǒng)組織方式的慣用模式驯击。架構(gòu)風(fēng)格反映了應(yīng)用領(lǐng)域中眾多系統(tǒng)所共有的結(jié)構(gòu)和語義特性,并指導(dǎo)如何將各個模塊和子系統(tǒng)有效地組織成一個完整的系統(tǒng)耐亏。
2徊都、軟件架構(gòu)風(fēng)格分類
Garlan和Shaw給出了通用架構(gòu)風(fēng)格的分類:
(1)數(shù)據(jù)流風(fēng)格:批處理序列;管道過濾器广辰。
(2)調(diào)用/返回風(fēng)格:主程序/子程序暇矫;面向?qū)ο箫L(fēng)格;層次結(jié)構(gòu)風(fēng)格择吊。
(3)獨立構(gòu)建風(fēng)格:進(jìn)程通信李根;事件系統(tǒng)。
(4)虛擬機(jī)風(fēng)格:解釋器干发;基于規(guī)則的系統(tǒng)朱巨。
(5)倉庫風(fēng)格:數(shù)據(jù)庫系統(tǒng);超文本系統(tǒng)枉长;黑板系統(tǒng)冀续。
2.1 數(shù)據(jù)流風(fēng)格
- 2.1.1 批處理序列
批處理風(fēng)格的每一步處理都是獨立的,并且每一步是順序執(zhí)行的必峰。只有當(dāng)前一步處理完洪唐,后一步處理才能開始。數(shù)據(jù)傳達(dá)在每一步處理之間作為一個整體吼蚁。比較適用于需要順序執(zhí)行的某些固定操作的場景凭需,并且這種流程不經(jīng)常進(jìn)行變化。
批處理的典型應(yīng)用:
(1)經(jīng)典數(shù)據(jù)處理肝匆;
(2)程序開發(fā)粒蜈;
(3)Windows下的BAT程序就是這種應(yīng)用的典型實例。
- 2.1.2 管道/過濾器
在管道/過濾器風(fēng)格的軟件架構(gòu)中旗国,每個構(gòu)件都有一個輸入和輸出枯怖,構(gòu)件讀取輸入的數(shù)據(jù),通過內(nèi)部處理能曾,產(chǎn)生輸出數(shù)據(jù)流度硝。這里的構(gòu)件就是過濾器,而這種風(fēng)格的連接件就像是數(shù)據(jù)流傳輸?shù)墓艿朗倜幔岩粋€過濾器的輸出數(shù)據(jù)流直接傳輸?shù)搅硪粋€過濾器蕊程,作為它的輸入數(shù)據(jù)。管道/過濾器的典型應(yīng)用:
(1)UNIX shell 編寫的程序驼唱;
(2)傳統(tǒng)的編譯器:一個階段(包括詞法分析藻茂、語法分析、語義分析和代碼生成)的輸出是另一個階段的輸入。
優(yōu)點
(1)使得軟構(gòu)件具有良好的隱蔽性和高內(nèi)聚捌治、低耦合的特點岗钩;
(2)將整個系統(tǒng)的輸入輸出行為看成是多個過濾器的行為合集;
(3)支持軟件復(fù)用(只要滿足兩個過濾器之間傳送數(shù)據(jù)的要求肖油,任何兩個過濾器都可以被連接起來);
(4)系統(tǒng)維護(hù)和增強(qiáng)系統(tǒng)性能簡單(新的過濾器可以隨時加入到系統(tǒng)中臂港,舊的過濾器也可以隨時被替換)森枪;
(5)允許對一些吞吐量、死鎖等屬性的分析审孽;
(6)支持并行執(zhí)行县袱。
缺點
(1)通常導(dǎo)致進(jìn)程成為批處理的結(jié)構(gòu)。這是因為雖然過濾器可以增量式地處理數(shù)據(jù)佑力,但是它們是獨立的式散,所以設(shè)計者必須將每個過濾器看成是一個完整的從輸入到輸出的轉(zhuǎn)換;
(2)不適合處理交互的應(yīng)用打颤。當(dāng)需要增量地顯示改變是暴拄,這個問題尤為嚴(yán)重;
(3)因為在數(shù)據(jù)傳輸上沒有通用的標(biāo)準(zhǔn)编饺,每個過濾器都增加了解析和合成數(shù)據(jù)的工作乖篷,這樣導(dǎo)致了系統(tǒng)性能的下降,并增加了編寫過濾器的復(fù)雜性透且。
2.2 調(diào)用/返回風(fēng)格
- 2.2.1 主程序/子程序
主程序/子程序風(fēng)格是結(jié)構(gòu)化開發(fā)時期的經(jīng)典架構(gòu)風(fēng)格撕蔼。這種風(fēng)格一般采用單線程控制,把問題劃分成若干處理步驟秽誊,構(gòu)件就是主程序和子程序鲸沮,主程序依次調(diào)用子程序,完成相關(guān)的處理動作锅论。過程調(diào)用作為交互機(jī)制讼溺,充當(dāng)了該架構(gòu)的連接件。
- 2.2.2 面向?qū)ο箫L(fēng)格
這種風(fēng)格建立在數(shù)據(jù)抽象和面向?qū)ο蟮幕A(chǔ)之上棍厌,數(shù)據(jù)的表示和它們的相應(yīng)操作被封裝在一個抽象數(shù)據(jù)類型或?qū)ο笾猩隹琛_@種風(fēng)格的構(gòu)件就是對象,對象維護(hù)自身的完整性耘纱,通過函數(shù)和過程調(diào)用來進(jìn)行交互(通過消息機(jī)制進(jìn)行對象間的通信)敬肚。特點
(1)對象負(fù)責(zé)維護(hù)其表示的完整性;
(2)對象的表示對其他對象而言是隱蔽的束析。因為一個對象對它的客戶隱藏了自己的表示艳馒,所以這些對象可以不影響它的客戶就能改變其實現(xiàn)方法。
優(yōu)點
(1)因為對象對其他對象隱藏它的表示,所以改變一個對象的表示弄慰,并不會對其他對象造成影響第美;
(2)設(shè)計者可以將一些數(shù)據(jù)存取操作的問題分解成一些交互的代理程序的集合。
缺點
(1)為了使一個對象和另外一個對象通過過程調(diào)用等進(jìn)行交互陆爽,必須知道對象的標(biāo)識什往。所以只要一個對象的標(biāo)識改變了,就必須修改所有其他明確調(diào)用它的對象慌闭;
(2)必須修改所有顯式調(diào)用它的其他對象别威,并消除因此帶來的一些副作用。例如驴剔,如果A使用了對象B省古,C也使用了對象B,那么丧失,C對B的使用所造成的對A的影響可能是料想不到的豺妓。
- 2.2.3 層次結(jié)構(gòu)風(fēng)格
主要的特征就是每一層只為上層進(jìn)行服務(wù),并作為下層的客戶布讹,內(nèi)部的層一般只對相鄰的層可見琳拭。最廣泛的應(yīng)用就是分層通信協(xié)議。這種架構(gòu)風(fēng)格支持功能增強(qiáng)和復(fù)用炒事,但是層次結(jié)構(gòu)風(fēng)格需要特別注意對系統(tǒng)性能的考慮臀栈,劃分的層次越多,層與層之間的交互成本就越高挠乳,整體的系統(tǒng)性能就越低权薯,而且在實際操作中,往往很難找到一個合適的睡扬、正確的層次抽象方法盟蚣。
2.3 獨立構(gòu)件風(fēng)格
獨立構(gòu)件風(fēng)格主要強(qiáng)調(diào)系統(tǒng)中的每個構(gòu)件都是相對獨立的個體,它們之間不直接通信卖怜,以降低耦合度屎开,提升靈活性。
- 2.3.1 進(jìn)程通信架構(gòu)風(fēng)格
進(jìn)程通信架構(gòu)風(fēng)格:構(gòu)件是獨立的過程马靠,連接件是消息傳遞奄抽。這種風(fēng)格的特點是構(gòu)件通常是命名過程,消息傳遞的方式可以是點對點甩鳄、異步和同步方式以及遠(yuǎn)程過程調(diào)用等逞度。
- 2.3.2 事件系統(tǒng)風(fēng)格
基于事件的隱式調(diào)用風(fēng)格,思想是Observer設(shè)計模式類似妙啃,構(gòu)件不直接調(diào)用一個過程档泽,而是通過觸發(fā)或廣播一個或多個事件俊戳。系統(tǒng)中其他構(gòu)件中的過程,在一個或多個事件中注冊馆匿,當(dāng)一個事件被觸發(fā)抑胎,系統(tǒng)自動調(diào)用在這個時間中注冊的所有過程,這樣渐北,一個事件的觸發(fā)就導(dǎo)致了另一個模塊中的過程調(diào)用阿逃。特點
主要特點是事件的觸發(fā)者并不知道哪些構(gòu)件會被這些事件影響。這樣不能假定構(gòu)件的處理順序腔稀,甚至不知道哪些過程會被調(diào)用盆昙,因此,許多隱式調(diào)用的系統(tǒng)也包含顯式調(diào)用作為構(gòu)件交互的補(bǔ)充形式焊虏。
優(yōu)點
(1)為軟件重用提供了強(qiáng)大的支持(當(dāng)需要將一個構(gòu)件加入到現(xiàn)存系統(tǒng)中時,只需要將它注冊到系統(tǒng)的事件中)秕磷。
(2)為改進(jìn)系統(tǒng)帶來了方便(當(dāng)用一個構(gòu)件替換另一個構(gòu)件時诵闭,不會影響到其他構(gòu)件的接口)。
缺點
(1)構(gòu)件放棄了對系統(tǒng)計算的控制澎嚣。一個構(gòu)件觸發(fā)了一個事件時疏尿,不能確定其他構(gòu)件是否會影響它。而且即使它知道了事件注冊了哪些構(gòu)件的過程易桃,它也不能保證這些過程被調(diào)用的順序褥琐。
(2)數(shù)據(jù)交換的問題。有時數(shù)據(jù)可能被一個事件傳遞晤郑,但另一些情況下敌呈,基于事件的系統(tǒng)必須依靠一個共享的倉庫進(jìn)行數(shù)據(jù)交互。在這種情況下造寝,全局性能和資源管理便成了問題磕洪。
2.4 虛擬機(jī)風(fēng)格
虛擬機(jī)風(fēng)格的基本思想是人為構(gòu)建一個運(yùn)行環(huán)境,在這個環(huán)境上诫龙,可以解析與運(yùn)行自定義的一些語言析显,這樣來增加架構(gòu)的靈活性。
- 2.4.1 解釋器風(fēng)格
一個解釋器通常包括完成解釋工作的解釋引擎签赃,一個包含將被解釋的代碼的存儲區(qū)谷异,一個記錄解釋引擎當(dāng)前工作狀態(tài)的數(shù)據(jù)結(jié)構(gòu),以及一個記錄源代碼被解釋執(zhí)行進(jìn)度的數(shù)據(jù)結(jié)構(gòu)锦聊。解釋器通常被用來建立一種虛擬機(jī)以彌合程序語義與硬件語義之間的差異歹嘹。其缺點 是執(zhí)行效率較低。典型的例子就是專家系統(tǒng)括丁。
- 2.4.1 基于規(guī)則的系統(tǒng)風(fēng)格
基于規(guī)則的系統(tǒng)包括規(guī)則集荞下、規(guī)則解釋器、規(guī)則/數(shù)據(jù)選擇器及工作內(nèi)存。適合根據(jù)外部事件尖昏,以自身狀態(tài)為基礎(chǔ)仰税,自動進(jìn)行處理和動作的場景。
2.5 倉庫風(fēng)格
在倉庫風(fēng)格中抽诉,有兩種不同的構(gòu)件: 中央數(shù)據(jù)結(jié)構(gòu)說明當(dāng)前狀態(tài)陨簇,獨立構(gòu)件在中央數(shù)據(jù)存儲上執(zhí)行,倉庫與外購件間的相互作用在系統(tǒng)中會有大的變化迹淌。
倉庫風(fēng)格中河绽,主要有:數(shù)據(jù)庫系統(tǒng)、超文本系統(tǒng)唉窃、黑板風(fēng)格等耙饰。
數(shù)據(jù)庫系統(tǒng)風(fēng)格的構(gòu)件主要有兩大類:一個是中央共享數(shù)據(jù)源,保存當(dāng)前系統(tǒng)的數(shù)據(jù)狀態(tài)纹份;另一個是多個獨立處理元素苟跪,處理元素對數(shù)據(jù)元素進(jìn)行操作。而超文本系統(tǒng)的典型代表蔓涧,就是早期的靜態(tài)頁面件已。
-
黑板架構(gòu)風(fēng)格
適用于處理復(fù)雜的非結(jié)構(gòu)化問題,能在求解過程中綜合運(yùn)用多種不同知識源元暴,使得問題的表達(dá)篷扩、組織和求解變得比較容易,是一種問題求解模型茉盏。
黑板系統(tǒng)主要由三部分組成:
(1)知識源鉴未。知識源中包含獨立的、與應(yīng)用程序相關(guān)的知識援岩,知識源之間不直接進(jìn)行通信歼狼,它們之間的交互只通過黑板來完成。
(2)黑板(共享數(shù)據(jù))享怀。黑板數(shù)據(jù)是按照應(yīng)用程序相關(guān)的層次來組織解決問題的數(shù)據(jù)羽峰,知識源通過不斷地改變黑板數(shù)據(jù)來解決問題。
(3)控制添瓷∶诽耄控制完全由黑板的狀態(tài)驅(qū)動,黑板狀態(tài)的改變決定使用的特定知識鳞贷。
2.6 總結(jié)
在學(xué)習(xí)架構(gòu)風(fēng)格的過程中坯汤,我遇到了很多困難和疑問,因為架構(gòu)風(fēng)格是一個高度抽象的結(jié)構(gòu)搀愧,理解起來比較吃力惰聂,所以建議學(xué)習(xí)過程中疆偿,最好上網(wǎng)找一些具體的實例加深理解和學(xué)習(xí)。另外搓幌,可以通過理論去聯(lián)系實際杆故,可以想一想實際項目中,都用到了哪些架構(gòu)風(fēng)格溉愁,或者說這種架構(gòu)風(fēng)格在實際項目中有沒有被應(yīng)用到处铛,這樣才能把每一種架構(gòu)風(fēng)格吃透。
另外需要指出的一點拐揭,軟件架構(gòu)風(fēng)格是一個大粒度的軟件復(fù)用撤蟆,而且架構(gòu)設(shè)計人員由于個人的視角和經(jīng)歷不同,設(shè)計的時候出發(fā)點會不一樣堂污,所以家肯,在選擇或者設(shè)計一個架構(gòu)風(fēng)格時,必須根據(jù)特定項目的具體情況盟猖、特點進(jìn)行分析對比息楔,多和其他項目成員溝通。這樣才能保證我們選擇的架構(gòu)風(fēng)格是最貼近于業(yè)務(wù)需求的扒披,而不是因為某一個架構(gòu)風(fēng)格比較流行就去選擇這個架構(gòu)風(fēng)格。