作者 | 崔皓
審校 | 孫淑娟
做過(guò)軟件架構(gòu)設(shè)計(jì)的同學(xué)都清楚,軟件架構(gòu)要解決的核心問(wèn)題就是對(duì)不同的軟件應(yīng)用使用重復(fù)的軟件架構(gòu)模式,說(shuō)白了就是達(dá)到架構(gòu)級(jí)別的重用。也就是說(shuō),在不同的軟件系統(tǒng)中,使用不同類型的軟件架構(gòu),將軟件架構(gòu)的使用進(jìn)行抽象,再對(duì)其分類,用這些歷經(jīng)時(shí)間打磨的軟件架構(gòu)套用不同的應(yīng)用場(chǎng)景,也就是架構(gòu)師常說(shuō)的架構(gòu)套路。這個(gè)套路就是今天我們要說(shuō)的軟件架構(gòu)風(fēng)格。
一、軟件架構(gòu)風(fēng)格
軟件架構(gòu)風(fēng)格是描述某一特定應(yīng)用領(lǐng)域中系統(tǒng)組織方式的慣用模式( idiomatic paradigm)。
架構(gòu)風(fēng)格包括四個(gè)要素:
- 一個(gè)詞匯表。其中包含構(gòu)件和連接件類型。
- 一套配置規(guī)則。描述了如何將構(gòu)件和連接件進(jìn)行組合。
- 一套語(yǔ)義解釋原則。用來(lái)解釋系統(tǒng)中的構(gòu)件和連接關(guān)系。
- 定義對(duì)基于風(fēng)格的系統(tǒng)的分析。針對(duì)不同類型軟件系統(tǒng),如何進(jìn)行分析。
二、最終目的:軟件架構(gòu)的復(fù)用
對(duì)軟件架構(gòu)風(fēng)格的研究和實(shí)踐促進(jìn)了對(duì)設(shè)計(jì)的重用,一些經(jīng)過(guò)實(shí)踐證實(shí)的解決方案也可以可靠地用于解決新的問(wèn)題。架構(gòu)風(fēng)格不變的部分使不同的系統(tǒng)可以共享同一個(gè)實(shí)現(xiàn)代碼。
軟件架構(gòu)風(fēng)格的分類
說(shuō)完了軟件架構(gòu)風(fēng)格的定義,接下來(lái)看看它的分類。由于軟件的應(yīng)用場(chǎng)景眾多,對(duì)其軟件架構(gòu)的抽象也不在少數(shù)。我們需要對(duì)軟件架構(gòu)進(jìn)行分類,甚至在分類的基礎(chǔ)上建立子類。
如下是對(duì)軟件架構(gòu)風(fēng)格的基本分類:
- 數(shù)據(jù)流風(fēng)格:它是對(duì)數(shù)據(jù)流進(jìn)行處理的軟件架構(gòu)風(fēng)格,分為批處理序列和管道-過(guò)濾器兩類,前者側(cè)重大批量的數(shù)據(jù)處理,后者更關(guān)注數(shù)據(jù)處理過(guò)程。
- 返回調(diào)用風(fēng)格:應(yīng)用程序會(huì)調(diào)用對(duì)應(yīng)的模塊并且返回需要的值。它包括主程序/子程序風(fēng)格、面向?qū)ο箫L(fēng)格和層次結(jié)構(gòu)風(fēng)格。
- 獨(dú)立構(gòu)件風(fēng)格:假設(shè)系統(tǒng)中的模塊或者服務(wù)都是獨(dú)立存在,通過(guò)事件和通信完成相互調(diào)用。包括進(jìn)程通信和事件驅(qū)動(dòng)兩種風(fēng)格。
- 虛擬機(jī)風(fēng)格:包括解釋器風(fēng)格和基于規(guī)則的系統(tǒng)風(fēng)格。前者在虛擬機(jī)中應(yīng)用廣泛,后者會(huì)在人工智能領(lǐng)域出現(xiàn)。
- 倉(cāng)庫(kù)風(fēng)格:包括數(shù)據(jù)庫(kù)架構(gòu)、黑板系統(tǒng)和超文本系統(tǒng)三種風(fēng)格。
- 控制環(huán)路風(fēng)格:讓組建之間形成反饋循環(huán),通過(guò)接受一定的輸入,確定一系列的輸出,最終使環(huán)境達(dá)到一個(gè)新的狀態(tài)。
雖然架構(gòu)風(fēng)格多種多樣,在不同的應(yīng)用場(chǎng)景我們會(huì)選擇不同的架構(gòu)風(fēng)格與之對(duì)應(yīng),接下來(lái)我們會(huì)舉一個(gè)實(shí)際的例子,通過(guò)對(duì)例子的分析引出架構(gòu)風(fēng)格的應(yīng)用。
三、軟件架構(gòu)風(fēng)格應(yīng)用舉例
前面描述了軟件架構(gòu)風(fēng)格的分類,多是定義略顯枯燥,這里會(huì)應(yīng)用一個(gè)車輛定速巡航的例子看看如何應(yīng)用軟件架構(gòu)的風(fēng)格。
如下圖所示,如果要開(kāi)發(fā)一套定速巡航系統(tǒng),從而確保車輛能夠隨時(shí)調(diào)整其行進(jìn)的速度。

如上圖所示,巡航控制系統(tǒng)有多個(gè)輸入和一個(gè)輸出,系統(tǒng)想要達(dá)到的目的就是通過(guò)這些輸入?yún)?shù)去調(diào)整油門這個(gè)輸出參數(shù),也就是控制油門,最終達(dá)到保持車速的目的。說(shuō)白了,就是不過(guò)輸入?yún)?shù)如何改變,車輛都保持一定的速度,因此油門就要隨之調(diào)整。
一起來(lái)看看這些輸入/輸出要素的定義:
- 系統(tǒng)開(kāi)關(guān):開(kāi)啟/關(guān)閉巡航控制系統(tǒng)
- 引擎開(kāi)關(guān):開(kāi)啟/關(guān)閉汽車引擎(引擎開(kāi)啟時(shí),巡航控制系統(tǒng)處于就緒狀態(tài))
- 車輪脈沖:車輪每轉(zhuǎn)一次,相應(yīng)地發(fā)出一次脈沖
- 剎車:當(dāng)剎車被踩下時(shí),定速巡航控制系統(tǒng)會(huì)臨時(shí)恢復(fù)到人工控制
- 增/減速:增加或減慢當(dāng)前車速(僅在定速巡航控制系統(tǒng)處于開(kāi)啟的狀態(tài)下可用)
- 恢復(fù)速度:恢復(fù)原來(lái)保持的車速(僅在定速巡航控制系統(tǒng)處于開(kāi)啟的狀態(tài)下可用)
- 時(shí)鐘:每毫秒定時(shí)脈沖
1.架構(gòu)風(fēng)格場(chǎng)景分析
既然有了具體的案例,就需要通過(guò)具體的使用場(chǎng)景來(lái)分析使用哪種架構(gòu)風(fēng)格?
適合面向?qū)ο蠹軜?gòu)風(fēng)格的應(yīng)用場(chǎng)景:
- 首先需要設(shè)置一個(gè)汽車行駛的預(yù)期速度,然后保持這個(gè)速度行駛。司機(jī)需要調(diào)整計(jì)速器來(lái)達(dá)到預(yù)期的速度,此時(shí)會(huì)觸發(fā)事件把增加或者減少速度的消息發(fā)送給計(jì)速器。計(jì)速器也會(huì)將車子的速度消息傳送給油門,告訴車子加速還是減速。
- 同時(shí)遇到障礙物需要?jiǎng)x車,也會(huì)發(fā)送消息給剎車系統(tǒng),并退出巡航控制系統(tǒng)。
上面描述的正是一個(gè)典型的事件驅(qū)動(dòng)場(chǎng)景,適合于面向?qū)ο箫L(fēng)格。面向?qū)ο蠹軜?gòu)風(fēng)格的特征是將數(shù)據(jù)標(biāo)識(shí)和基本操作封裝在對(duì)象中。這種模式的構(gòu)件是對(duì)象,對(duì)象維護(hù)自身表示的完整性,對(duì)象之間通過(guò)消息機(jī)制進(jìn)行通信,對(duì)象交互時(shí)需要知道彼此的標(biāo)識(shí),通過(guò)對(duì)象之間的協(xié)作完成計(jì)算過(guò)程。
再換一個(gè)角度,適合面向控制環(huán)路架構(gòu)風(fēng)格的應(yīng)用場(chǎng)景:
司機(jī)通過(guò)調(diào)整計(jì)速器達(dá)到了預(yù)期速度之后,系統(tǒng)維持恒定速度行駛,但是在行駛過(guò)程中會(huì)遇到路面顛簸、拐彎等情況,車輛速度不可能一直保持恒定,在上述情況下車輛速度會(huì)降低。降低的車速實(shí)際是整個(gè)系統(tǒng)的輸出,這個(gè)輸出會(huì)作為輸入再次返回到系統(tǒng)中,系統(tǒng)會(huì)將這個(gè)速度與預(yù)期的速度進(jìn)行比較,如果低于預(yù)期的速度,會(huì)進(jìn)行加速的操作。同理,如果超過(guò)了預(yù)期的速度就會(huì)執(zhí)行減速的操作。
這是一個(gè)典型的閉環(huán)控制的情景,系統(tǒng)需要在外界情況不斷發(fā)生變化的情況下進(jìn)行調(diào)整,使得系統(tǒng)狀態(tài)盡可能接近期望狀態(tài)。
過(guò)程控制環(huán)路(閉環(huán)):是將過(guò)程輸出的指定屬性維護(hù)在一個(gè)特定的參考值(設(shè)定值),將事務(wù)處理看成輸入、加工、輸出、反饋、再輸入的一個(gè)持續(xù)的過(guò)程模型。
這里的輸入就是車輛的當(dāng)前速度,加工就是求得預(yù)期速度與當(dāng)前速度的差,反饋就是進(jìn)行增速還是減速,再將得到數(shù)據(jù)給到輸入,不斷循環(huán)。
有了對(duì)應(yīng)用場(chǎng)景的分析之后,再?gòu)拿嫦驅(qū)ο蠛涂刂骗h(huán)路兩種風(fēng)格如何,看如何設(shè)計(jì)架構(gòu)。
2.面向?qū)ο蠹軜?gòu)風(fēng)格分析
對(duì)于系統(tǒng)的增減速功能,采用面向?qū)ο箫L(fēng)格的巡航控制系統(tǒng)首先會(huì)定義司機(jī)、油門、時(shí)鐘、速度計(jì)和車輪等構(gòu)件。

整個(gè)計(jì)算的主要過(guò)程如上圖所示:
- 司機(jī)進(jìn)行增/減速操作設(shè)置期望速度,該期望速度以消息的形式傳遞給速度計(jì);
- 速度計(jì)通過(guò)向車輪和時(shí)鐘發(fā)送消息獲取車輪轉(zhuǎn)速和時(shí)鐘值,得到當(dāng)前速度;
- 速度計(jì)計(jì)算當(dāng)前速度和期望速度的速度差值;
- 該差值以消息的形式發(fā)送給油門,油門通過(guò)速度差值調(diào)節(jié)自身狀態(tài)。
整個(gè)過(guò)程在時(shí)鐘的控制下定期向速度計(jì)發(fā)送消息,重復(fù)執(zhí)行2~4。
3.控制環(huán)路架構(gòu)風(fēng)格分析
控制環(huán)路的架構(gòu)風(fēng)格以控制器為核心,期望速度、車輪脈沖、時(shí)鐘和油門等作為構(gòu)件。

具體的計(jì)算過(guò)程如上圖所示:
- 司機(jī)進(jìn)行增/減速操作設(shè)置期望速度值
- 將設(shè)定值置為期望速度值,并將其交給比較器
- 比較器會(huì)采集車輪脈沖和時(shí)鐘值,計(jì)算出當(dāng)前速度,連同預(yù)期速度都交給控制器;
- 控制器比較期望速度和當(dāng)前速度,計(jì)算速度差值,控制油門,執(zhí)行加速或者不加速的動(dòng)作,并將速度這個(gè)被控對(duì)象反饋給比較器。
反復(fù)執(zhí)行3和4形成速度的反饋閉環(huán)。
四、總結(jié)
所謂架構(gòu)風(fēng)格就是經(jīng)過(guò)時(shí)間考驗(yàn)的架構(gòu)分析的套路,針對(duì)不同的應(yīng)用場(chǎng)景可以利用不同的架構(gòu)風(fēng)格,說(shuō)到底就是對(duì)軟件架構(gòu)的復(fù)用,讓前人設(shè)計(jì)的架構(gòu)能夠被反復(fù)使用。架構(gòu)風(fēng)格分為:數(shù)據(jù)流、返回調(diào)用、獨(dú)立構(gòu)件、虛擬機(jī)、倉(cāng)庫(kù)、控制環(huán)路等多種。
文中我們通過(guò)汽車定速巡航的例子,引出了面向?qū)ο蠛涂刂骗h(huán)路的兩種架構(gòu)風(fēng)格,告訴大家如何從應(yīng)用場(chǎng)景的定義選擇適合的架構(gòu)風(fēng)格。并且,針對(duì)兩種不同的架構(gòu)風(fēng)格,給出了架構(gòu)分析的具體方法。
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開(kāi)發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。曾任惠普技術(shù)專家。樂(lè)于分享,撰寫(xiě)了很多熱門技術(shù)文章,閱讀量超過(guò)60萬(wàn)?!斗植际郊軜?gòu)原理與實(shí)踐》作者。
























