關(guān)于我們
書單推薦
新書推薦
|
世界著名計算機教材精選:軟件架構(gòu)與模式 《世界著名計算機教材精選:軟件架構(gòu)與模式》可供計算機專業(yè)學(xué)生、工科學(xué)者、系統(tǒng)開發(fā)人員和大型系統(tǒng)的系統(tǒng)架構(gòu)設(shè)計人員閱讀。本書的目標是讓讀者掌握系統(tǒng)架構(gòu)和模式的基本原理與實際應(yīng)用。 1. 介紹面向?qū)ο笤O(shè)計方法中的架構(gòu)和設(shè)計模式。 2. 有助于提高軟件的編寫質(zhì)量,加深對軟件理論知識的理解,擴展專業(yè)視野,了解大型軟件開發(fā)中的架構(gòu)模式。 3. 介紹的設(shè)計模式和架構(gòu)模式都配有Java語言的程序?qū)嵗,模式中類和類之間的靜態(tài)關(guān)系或?qū)ο箝g的動態(tài)關(guān)系都用UML語言描述。各章末均提供了相應(yīng)的練習(xí)。 4. 本書在網(wǎng)絡(luò)上提供各章練習(xí)答案和書中實例的Java代碼。 5. 可以作為高校計算機相關(guān)專業(yè)的教材,也可供系統(tǒng)開發(fā)人員和大型系統(tǒng)的系統(tǒng)架構(gòu)設(shè)計人員閱讀參考。 譯 者 序 隨著中德兩國交往的不斷加深,各行各業(yè)都在不斷地拓展多方位的合作。但是中德兩國在軟件行業(yè)的合作卻并不多見,來自德國的計算機類翻譯著作也非常少。 德國企業(yè)出于嚴謹?shù)娘L(fēng)格和安全性的考慮,基本很少有軟件外包,對于應(yīng)用軟件的開發(fā)和使用一般也都局限在德國本土范圍內(nèi)(除了一些大型公司,如SAP),所以我們對德國計算機行業(yè)的發(fā)展了解得并不多。 本書的作者Goll教授不僅有多年的計算機軟件工作經(jīng)驗,同時還在德國Esslingen應(yīng)用技術(shù)大學(xué)創(chuàng)建了軟件專業(yè),1994年他還建立了Steinbeis-Transferzentrum Systemtechnik軟件公司。因為該公司所在地是奔馳公司和博世公司的總部,所以主要從事汽車和自動化方向的軟件開發(fā)。我在上學(xué)期間曾得到Goll教授的耐心指導(dǎo)。Goll教授無論是在專業(yè)技術(shù)還是在教學(xué)業(yè)務(wù)上都是令人敬重和贊佩的。 希望這本書的引進能夠使廣大讀者對德國的軟件技術(shù)有初步的認識。本書共分為5章。前3章主要是介紹一些軟件技術(shù)的理論。第4章介紹了常用的軟件模式,具有一定的軟件基礎(chǔ)知識的讀者通過學(xué)習(xí)本章的內(nèi)容可以提高編寫軟件的質(zhì)量,同時加深對軟件理論知識的理解。第5章介紹了軟件架構(gòu)模式,讀者在熟練掌握軟件模式后,通過本章可以擴展視野,逐步了解大型軟件開發(fā)所使用的架構(gòu)模式。對于軟件開發(fā)人員來說,通過學(xué)習(xí)本章的內(nèi)容可以加快在專業(yè)方面的成長。 賈山翻譯了本書的第1章、第3章和第4章,天津理工大學(xué)的李欣老師翻譯了第2章和第5章。在本書翻譯過程中,譯者得到了清華大學(xué)出版社的大力支持和幫助,在此致以衷心的感謝。讀者如果在閱讀中有任何疑問,可以直接發(fā)送電子郵件到zd_jiashan@126.com。 賈山 2016年10月 前 言 本書的內(nèi)容 軟件系統(tǒng)的架構(gòu)應(yīng)該是易于擴展和標準化的,這樣便于開發(fā)者對系統(tǒng)架構(gòu)進行修改。在面向?qū)ο笤O(shè)計方法中,已經(jīng)有很多有意義的架構(gòu)和設(shè)計模式。這些模式都是建立在面向?qū)ο罄碚摶A(chǔ)上的,例如依賴倒置原則。所以,本書首先介紹的是一些基本的原則,接下來講解如何把這些面向?qū)ο蟮脑瓌t運用到系統(tǒng)架構(gòu)和設(shè)計模式中。所有這些講解都配有Java語言的程序?qū)嵗?/p> 在講解設(shè)計原則之后,本書將重點探討系統(tǒng)架構(gòu)和設(shè)計模式,通過附帶的實例,讀者可以從中選擇適合自己系統(tǒng)的模式。書中的一些實例只截取了部分代碼,完整的實例可以從相應(yīng)的網(wǎng)站上查看。 本書可供計算機專業(yè)學(xué)生、工科學(xué)者、系統(tǒng)開發(fā)人員和大型系統(tǒng)的系統(tǒng)架構(gòu)設(shè)計人員閱讀。本書的目標是讓讀者掌握系統(tǒng)架構(gòu)和模式的基本原理與實際應(yīng)用。 書中的實例都是以Java語言為基礎(chǔ)的。在講解模式中類和類之間的靜態(tài)關(guān)系或者是對象之間的動態(tài)關(guān)系時,均是借助于UML語言進行描述的。所以讀者應(yīng)該具備Java語言和UML語言的基礎(chǔ)知識。 書中的圖標表示對相應(yīng)的內(nèi)容做簡短的總結(jié)。圖標提醒讀者,這是在實際開發(fā)過程中經(jīng)常容易導(dǎo)致錯誤的地方。 每章附帶簡單的練習(xí),書中沒有提供答案,讀者可以在相應(yīng)的網(wǎng)站上查看。 本書的緣起 本書作者在此前的另一本書《軟件技術(shù)的方法和架構(gòu)》[Gol11]1中的第2章曾經(jīng)簡短地介紹了設(shè)計和架構(gòu)模式。在本書中,主要介紹這部分內(nèi)容,不僅對這部分內(nèi)容做認真的整理,而且還增加了面向?qū)ο笤O(shè)計的基本原理,因為這是設(shè)計模式的基礎(chǔ)和加深理解模式所必需的。在吸收了模式后面隱藏的設(shè)計原理并重新修訂以后,就形成了此書。 各章概要 下面簡單地介紹各章的主要內(nèi)容。 第1章討論面向?qū)ο笤O(shè)計的基本原則,包括對于一個類的設(shè)計和多個類間合作的設(shè)計原則。一個類的設(shè)計原則有封裝、抽象、信息隱藏、關(guān)注點分離、單一職責(zé)原則和接口隔離原則。多個類的合作涉及松耦合原則、里氏代換原則、契約式設(shè)計原則、開閉原則和依賴倒置原則。隨后分析了控制反轉(zhuǎn)和在對象創(chuàng)建過程中減少相互依賴性,這兩個是還沒有形成“原則”的技術(shù)。 第2章關(guān)注軟件架構(gòu)概念的定義和軟件架構(gòu)關(guān)于非功能性的質(zhì)量。軟件設(shè)計中的參考架構(gòu)和模式的相互比較。在分析和討論構(gòu)建一個系統(tǒng)的主要任務(wù)、軟件架構(gòu)的不同層次和結(jié)構(gòu)模型以后,再研究軟件架構(gòu)師對一個項目的意義。 第3章研究架構(gòu)模式、設(shè)計模式和慣用法的每一個特性,最后介紹描述設(shè)計模式和架構(gòu)模式的模板。 第4章研究面向?qū)ο笤O(shè)計模式。面向?qū)ο笤O(shè)計模式多用于在軟件開發(fā)中解決子系統(tǒng)中的特定問題。設(shè)計模式由類組成,通過類之間的互相協(xié)作解決特定的問題。每一個模式適用于一類問題的解決。本章將介紹結(jié)構(gòu)模式、行為模式和創(chuàng)建型模式。在結(jié)構(gòu)模式中講解適配器模式、橋梁模式、裝飾模式、外觀模式、組合模式和代理模式。在行為模式中研究模板方法模式、命令模式、觀察者模式、策略模式、中間者模式、狀態(tài)模式、角色模式、拜訪者模式和迭代器模式。創(chuàng)建型模式包括工廠方法模式、抽象工廠模式、單例模式和對象池模式。 第5章介紹架構(gòu)模式。架構(gòu)模式可以把系統(tǒng)劃分為系統(tǒng)組件。一個架構(gòu)模式可以含有多個設(shè)計模式,也可以不含有設(shè)計模式,例如分層架構(gòu)模式就不包含設(shè)計模式。本章介紹分層架構(gòu)模式、管道和過濾器架構(gòu)模式、插件架構(gòu)模式、中介模式、面向服務(wù)的設(shè)計模式和模型-視圖-控制器(MVC)模式。 書寫格式 本書中重要的概念加粗顯示。 相應(yīng)網(wǎng)址的重要提示 本書相應(yīng)的網(wǎng)址為http://pan.baidu.com/s/1o6MEsqu,包含各章練習(xí)答案和書中的實例。 感謝 作者在編寫本書的過程中,從實例到文字得到了很多人的幫助。他們是Benjamin Adolphi先生、Sebastian Bickel先生、Manuel Gotin先生、Konstantin Holl先生、Dominic Kadynski先生、MichaKoller先生、Paul Krohmer先生和Philipp Stehle先生。Steffen Wahl先生、Christian Tolk先生、Fabian Wirsum先生和Jennifer Rauscher女士對文字處理和資源配置做了長期大量的細致工作。作者在此表示衷心的感謝。 J. Goll/M. Dausmann 1 本書正文中提及的參考文獻均以5字符或6字符代號表示,詳見書末的“參考文獻”!g注 書中涉及的概念 派生類 一個派生類是從一個基類派生出來的。派生類繼承了基類的結(jié)構(gòu)(屬性的名稱和類型)和方法。 依賴性 依賴性是指兩個模型元素間的特殊關(guān)系。它表明,一個獨立元素的變化會影響到相關(guān)的元素。 抽象窗口工具包(AWT) AWT類庫是Swing類庫的前身。AWT-GUI組件與操作系統(tǒng)密切相關(guān)。Swing-GUI組件則借助于Java 2D的類庫,通過Java的模擬機顯示在屏幕上,所以看起來操作系統(tǒng)沒有依賴性。 抽象類 抽象類不能構(gòu)造實例。從技術(shù)上講,一個抽象類包含一個或多個方法的定義,但是在抽象類里并沒有實現(xiàn)這些方法。沒有實現(xiàn)的方法只能在其派生類中實現(xiàn)。 抽象類也可以是不包含抽象方法的。這種抽象類只是為表達自身,不能被實例化。例如,一個“電器”或“飲料”不能被實例化。 抽象 抽象就是去掉每一個不重要的細節(jié),而只專注于重點內(nèi)容。 聚集 聚集是一種特殊的組合,它表達的是部分與整體的關(guān)系,說明部分與整體的生存期沒有關(guān)聯(lián)。這一點與組合(composition)正好相反。 參與者 參與者是指一個陌生的系統(tǒng)或者一個設(shè)備在系統(tǒng)環(huán)境中的角色。參與者與系統(tǒng)之間是相互作用的。 用例圖(use case) 用例圖是描述系統(tǒng)可以提供的服務(wù),包括實現(xiàn)這些功能的步驟。用例圖的功能通常由協(xié)作圖(對象之間的交互)實現(xiàn)。 架構(gòu) 架構(gòu)可以理解為: * 把系統(tǒng)分解為模塊。 * 描述如何通過模塊間的合作實現(xiàn)目標功能。 * 描述結(jié)構(gòu)的策略,即分解(靜態(tài)的)和功能(動態(tài)的)。 軟件架構(gòu)設(shè)計的目標就是讓系統(tǒng)對外能實現(xiàn)所期望的功能。 關(guān)聯(lián) 關(guān)聯(lián)描述了連接的規(guī)則,用于連接兩個或多個對象(對象是同級別的)。關(guān)聯(lián)從原則上說是一個類間的對稱結(jié)構(gòu)關(guān)系。人們可以把關(guān)聯(lián)限制成單向的。 屬性 屬性的概念存在于類、對象、關(guān)聯(lián)和數(shù)據(jù)庫中。面向?qū)ο笾械膶傩愿拍顏碜悦嫦驍?shù)據(jù)范例。這意味著: * 屬性屬于類或?qū)ο蟆?/p> * 一個關(guān)聯(lián)類描述了一個關(guān)聯(lián)的特性。 * 數(shù)據(jù)庫中關(guān)系(表)的一列也稱為屬性。屬性與列的取值并不相關(guān),而只是列的標題。屬性值是列里面具體的一個取值。 基類 基類處在繼承的層次結(jié)構(gòu)中,在被關(guān)注類的上方。 關(guān)系 兩個或多個元素之間的關(guān)系是指這些元素之間存在的聯(lián)系。關(guān)系有動態(tài)的和靜態(tài)的。 分類器 分類器是來自UML元模型的一個概念。一般認為,如果UML的模型元素能夠生成一個實例,它就是分類器。一個分類器正常情況下有一個結(jié)構(gòu)和一個功能,例如抽象類是一個分類器。接口可以特殊地當作是分類器,因為接口沒有屬性,也就是說沒有結(jié)構(gòu)。 委托 委托是一種結(jié)構(gòu),一個對象收到一條信息后,并不是自己實現(xiàn)全部方法,而是把消息繼續(xù)傳遞下去。 依賴倒置 一個對象依賴于另一個對象,使用依賴倒置后,依賴的方向會倒轉(zhuǎn),即依賴和被依賴的實體關(guān)系被倒轉(zhuǎn)。 依賴倒置原則 依賴倒置原則是為了避免或者減少不同等級中模塊間的依賴關(guān)系。這就要求一個高一級的類不能依賴于一個低一級的類。高一級的類應(yīng)該聚集了一個接口或者是一個抽象類。這個抽象類或接口應(yīng)該由高一級的類決定,低一級的類應(yīng)該依賴于這個抽象類或接口。 圖表 圖表是觀察系統(tǒng)的特定視角。 在UML中的圖表大部分包含許多用線連接起來的節(jié)點。此外,還有時間圖,用于模擬電子的脈沖圖表。 實體 實體在所要處理的問題框架內(nèi),具有一定的意義。它可以表示物品、生物或者草案。 實體對象 實體對象就是現(xiàn)實世界中物品、生物或者草案的抽象化表示。 設(shè)計模式(design pattern) 在針對一個問題的最佳解決方案中,類或?qū)ο笸ㄟ^相互合作所實現(xiàn)的功能,可以成為這類問題的解決方案。 事件 事件是控制流或者控制流的組合。系統(tǒng)應(yīng)對事件做出反應(yīng)。 框架 框架可以為正在開發(fā)的系統(tǒng)提供類,其派生類可以繼承它的功能?蚣芸梢詻Q定應(yīng)用的結(jié)構(gòu),即粗略的結(jié)構(gòu)?蚣芏x類和對象的劃分、各自的中心職責(zé)、類和對象的合作以及它們的控制流[Gam95]。 保密原則 保密原則確保類的對象中的內(nèi)部和私有結(jié)構(gòu)對外是不可以使用的,只有在類的內(nèi)部才可以識別內(nèi)部結(jié)構(gòu)和方法的具體實現(xiàn)部分。接口和它的實現(xiàn)部分是分離的。對象中的數(shù)據(jù)只能通過接口中定義的方法來使用。 泛化 泛化與細分的方向相反。在泛化時,要在繼承的層次結(jié)構(gòu)的上端整理綜合的屬性,然后向下細分,泛化的屬性也會被繼承。在繼承的層次結(jié)構(gòu)中,向上是泛化,向下是細分。 業(yè)務(wù)流程 業(yè)務(wù)流程是專業(yè)技術(shù)方面的工作進程。它體現(xiàn)了為達到一個業(yè)務(wù)目標所采用的各個相關(guān)措施的結(jié)合。 分組 分組是多個元素的組合。在UML中存在包的模型元素。包并不是系統(tǒng)的組成部分,而是概念上的示意圖,把元素清楚地按組進行組合。 標識 即使不同的對象擁有相同的屬性值時也可以區(qū)分開它們,因為每個對象都有自己的 標識。 慣用法 慣用法是在特定的程序語言中的模型,是在深層次的抽象水平上作為設(shè)計模式或架構(gòu)模式,即可以用一種編程語言來實現(xiàn)設(shè)計模式,用來解決不適用于設(shè)計模式的特定技術(shù) 問題。 實例 實例是UML模型元素的具體表現(xiàn)形式。 實例化 生成類型的實例。 交互 交互是通過兩個對象間傳送消息或者是多個對象相互作用而體現(xiàn)出的動態(tài)關(guān)系。 進程間通信 進程間通信(IPC)是把進程間的通信看做聯(lián)動機制。進程間通信的概念包括操作系統(tǒng)進程對操作系統(tǒng)進程的通信、線程對線程的通信。在一臺計算機上要進行進程間通信,需要借助于這臺計算機的操作系統(tǒng)進行信息交換。如果并行的進程分布在不同的計算機,則計算機之間必須可以使用計算機對計算機的通信。 控制反轉(zhuǎn) 在控制流反轉(zhuǎn)時,原先掌握控制流的程序要把控制權(quán)轉(zhuǎn)交給其他的模塊(大部分情況是可復(fù)用的模塊),這樣可以從輪詢轉(zhuǎn)換到事件驅(qū)動。一個可復(fù)用的模塊(例如框架)常常調(diào)用專有模塊(例如應(yīng)用程序)。 通道 通道表示點到點的連接,用直線來表示。通道遵守先進先出原則,即先進入通道的先離開。 封裝 封裝是面向?qū)ο蟪绦蛟O(shè)計中的重要概念之一。一般認為把數(shù)據(jù)和所屬的功能放在一個盒子里(類)是十分有意義的,這樣數(shù)據(jù)和所屬功能沒有被分開。 基數(shù) 基數(shù)的概念在數(shù)據(jù)庫和UML中都存在: * 在數(shù)據(jù)庫領(lǐng)域,基數(shù)在系統(tǒng)分析階段確定實體與實體之間數(shù)量的對應(yīng)關(guān)系,或者在系統(tǒng)設(shè)計階段確定表與表的數(shù)據(jù)記錄數(shù)量的對應(yīng)關(guān)系;鶖(shù)可以依照關(guān)系類型標明 1對1、1對n或者n對m。 * 在UML中基數(shù)表明所關(guān)注的UML元素的個數(shù)。借助于基數(shù)可以表示出多倍的關(guān)系(例如,1..m)。 類 類在面向?qū)ο笾畜w現(xiàn)的是一種數(shù)據(jù)類型,它可以生成對象。類含有結(jié)構(gòu)和功能。結(jié)構(gòu)包括屬性。類里面的方法決定了其對象的功能。類的每一個對象都有自己的標識。 類圖 類圖展示的是類與類之間的靜態(tài)關(guān)系(關(guān)聯(lián)、泛化、實現(xiàn)或依賴)。 協(xié)作 協(xié)作由一系列對象組成,它們通過合作實現(xiàn)在應(yīng)用場景下的功能。對象的協(xié)作可以實現(xiàn)一個功能。 通信圖 通信圖是在二維空間里展示所關(guān)注的對象、對象間的連接和沿連接實現(xiàn)的信息在對象間的交換。通過把對象分組和對象間的合作,盡管對象的連接是從動態(tài)角度出發(fā)的,也可以清晰地看出對象的結(jié)構(gòu)組織。 模塊 模塊的概念體現(xiàn)在系統(tǒng)劃分和模塊技術(shù)中: * 模塊1是系統(tǒng)的組成部分,也就是劃分的產(chǎn)物。 * 模塊在模塊技術(shù)中表示它是系統(tǒng)模塊化的一部分。模塊功能的具體實現(xiàn)隱藏在模塊對外的接口內(nèi)。與類相對比,調(diào)用模塊的所有方法都必須通過接口。模塊可以穩(wěn)定地安裝在計算機上。模塊在實際使用中往往包含一個或多個類、接口或小的模塊。 模塊模型 模塊模型在軟件技術(shù)中描述的是由模塊組成的系統(tǒng)運行時的框架。模塊模型定義了箱體,單模塊系統(tǒng)在箱體里運行(運行環(huán)境),同時還定義了模塊對箱體的接口和對其他模塊的接口。對此已經(jīng)定義了很多模塊的結(jié)構(gòu),比如模型的持久性、安全性和版本管理。 組合 組合是關(guān)聯(lián)的一個特例,它描述的是整體與其局部的關(guān)系。局部的存在和整體的存在相關(guān)聯(lián),一個局部只屬于一個唯一的整體。 具體類 具體類可以實例化,即具體類可以生成對象。 構(gòu)造函數(shù) 構(gòu)造函數(shù)是一個特殊的方法。構(gòu)造函數(shù)與類名相同,在生成對象時被調(diào)用,為實例化服務(wù)。構(gòu)造函數(shù)沒有返回值類型,而且不能被繼承。 控制對象 控制對象并不是現(xiàn)實世界的實體?刂茖ο笙喈斢谝粋流程控制。 生命線 生命線存在于UML的時序圖和通信圖中。對象在通信圖中作為對話者可以在UML中被描述為生命線。在UML的時序圖和通信圖中的生命線之間可以實現(xiàn)信息交流。 方法 一個方法實現(xiàn)一個操作。 中間件 中間件是程序的一個層次,它可以擴展延伸到多臺計算機,服務(wù)于分布式應(yīng)用的進程間通信。中間件還有其他功能,如持久化服務(wù)、信息安全功能或名稱管理。 多重性 多重性是對集合可能采取的基數(shù)范圍的說明。 消息 對象之間可以通過消息進行溝通,接收者負責(zé)對消息進行解釋。 導(dǎo)航 通過導(dǎo)航可以觀察哪些對象是可以訪問的(這些對象的類之間存在聯(lián)系)。導(dǎo)航就是說明連接一端的對象是否能夠到達連接另一端的對象。對于直接可以導(dǎo)航的就不需要繞路訪問了。 并行 如果事件A和B可以互不依賴地獨自工作,就稱為是并行的。也就是說,“A先發(fā)生,然后B發(fā)生”和“B先發(fā)生,然后A發(fā)生”是等效的。 注釋 注釋是在UML中對一個或者多個模型元素的注解。 對象圖 對象圖顯示的是在一個特定時刻對象和對象之間的連接。 操作 一個操作在UML中表達一個抽象的方法。它包括名稱、參數(shù)、返回值類型、前置條件、后置條件和操作的詳細說明。一個操作將會在一個類中通過方法實現(xiàn)。操作的定義包括操作的名稱,對應(yīng)于所屬方法的參數(shù)和返回值類型。 在操作的詳細說明中,一般說明這個操作可以在不同的類中實現(xiàn)。一個操作通過詳細說明擁有一個特殊的含義(語義)。這個含義對于所有通過方法實現(xiàn)這個操作的類是相同的。例如,一個操作可以通過“給出名稱和屬性值”來詳細說明。在不同的類里如何用個數(shù)互不相同的屬性來實現(xiàn)。 操作視圖 操作視圖只關(guān)注對用戶重要的功能,不考慮系統(tǒng)管理員。 包 UML中的包用作對子包的分組或模型元素的分組,如類、接口、用例等。包可以理解為命名空間,用于訪問保護的單元,使組織結(jié)構(gòu)更加清晰。 面板 面板是一種無形的對象容器,可以把圖形組件分成不同的組。 范式 范式是一種思維模式。 持久性 對象的持久性意味著它的壽命超過了一個會話(session),因為它們存儲在非易失性存儲介質(zhì)(如磁盤)中。 多態(tài)性 多態(tài)性意味著多樣性。例如,一個子類型的對象可以看做是它的基類。 協(xié)議 通信雙方進行通信的一組規(guī)則。 邊界條件 邊界條件經(jīng)常稱為限制,是必須起作用的條件。它可以正式或非正式地加以描述,可以由相鄰的系統(tǒng)指定。 實現(xiàn)關(guān)系 實現(xiàn)關(guān)系是兩個元素間(按照UML分類)的靜態(tài)關(guān)系。其中一個元素對契約進行描述,另一個元素在實現(xiàn)過程中必須遵守這個契約。例如,一個類實現(xiàn)一個接口,在協(xié)作圖中的實現(xiàn)用例都是實現(xiàn)關(guān)系。 角色 角色的概念有多重含義: * 角色可以是代理人1。 * 角色可以實現(xiàn)一個接口。 在關(guān)聯(lián)和角色設(shè)計模式中,每一個對象可以承載一個角色。對象可以實現(xiàn)角色定義的接口,對外實現(xiàn)角色的功能。 接口 接口就是操作的清單。操作可以是一個類別(類或組件)提供的服務(wù)。一個接口可以表達一個類或組件的所有操作或者一部分操作。實現(xiàn)接口的類或組件必須遵守接口中對操作的定義。 自我委托 一個對象的方法調(diào)用自己的另外一個方法。 時序圖 時序圖按照時間順序描述對象間或?qū)ο笈c角色(系統(tǒng)角色)間信息的交換。 序列化 序列化(或稱為信號編集)是把方法調(diào)用的變化寫入到信息中。 編程中的簽名和UML中的簽名 簽名的定義在編程和UML中的用法不同: 。1)在UML中:導(dǎo)出接口包括方法名稱、參數(shù)類型列表和返回值類型。 。2)在Java中:導(dǎo)出接口包括方法名稱和參數(shù)類型列表。 會話(Session) 會話就是網(wǎng)絡(luò)中兩個地址化的單位利用建立起的連接進行數(shù)據(jù)交換。 涉眾(Stakeholder) 涉眾是對系統(tǒng)感興趣的自然人、法人或者一組人。這種興趣會影響到系統(tǒng)的軟件和硬件需求。 結(jié)構(gòu) 系統(tǒng)的結(jié)構(gòu)是其靜態(tài)布局。 子類 參見派生類。 表 表是類似結(jié)構(gòu)的數(shù)據(jù)的綜合。在關(guān)系數(shù)據(jù)庫中也稱為關(guān)系。 類型 類型有屬性和操作,對于屬性有取值范圍。 繼承 在面向?qū)ο笾校粋類可以繼承另外一個類或者是從一個類派生出來。通過繼承,類自動擁有了基類的屬性和方法,就是說它繼承了基類的結(jié)構(gòu)和功能。 繼承的層次結(jié)構(gòu) 通過類之間的繼承關(guān)系,形成了層次結(jié)構(gòu):派生類從屬于基類,或者說基類處于派生類的上一級。 在Java中,所有的類都是從類Object派生出來的,所以這個類在Java中處在繼承層次結(jié)構(gòu)的根部。 行為 系統(tǒng)的行為是其功能的表述。 連接 連接是關(guān)聯(lián)的一個實例。 使用關(guān)系 人們要表達一個元素使用另外一個元素,可以在UML中通過 use 表明它們的依賴關(guān)系。use關(guān)系就是通常所說的使用關(guān)系。使用關(guān)系表明一個元素的含義(語義)依賴于另外一個元素的含義(語義)。 狀態(tài)圖 按照Harel 或者Hatley/Pirbhai的理論,UML的狀態(tài)圖是狀態(tài)轉(zhuǎn)化圖的一個變形。狀態(tài)圖由要詳細描述的類元的狀態(tài)(可能是區(qū)域1性的)和轉(zhuǎn)移組成。狀態(tài)可以是延遲、進入行為、退出行為和狀態(tài)行為。轉(zhuǎn)移描述引起狀態(tài)變化的事件、條件以及類元在轉(zhuǎn)化過程中的行為。在給反應(yīng)式系統(tǒng)(reactive system)建模時需要狀態(tài)圖。 狀態(tài)轉(zhuǎn)化圖 按照Harel 或者Hatley/Pirbhai的理論,在狀態(tài)轉(zhuǎn)化圖中系統(tǒng)的狀態(tài)在建模時以圖形化表示。圖形借助于狀態(tài)和轉(zhuǎn)移(狀態(tài)的變化)描述了一個自動裝置。轉(zhuǎn)移詳細說明了觸發(fā)事件、狀態(tài)變化的條件以及由狀態(tài)變化引起的行動。 第1章 面向?qū)ο笤O(shè)計的原理 1 第3章 軟件設(shè)計的模式 軟件開發(fā)過程中的每一步都有對應(yīng)的模式:用于系統(tǒng)分析的模式、系統(tǒng)設(shè)計模式、編程模式和測試模式。對于特殊的任務(wù)也有模式,比如對設(shè)計圖形界面或者與數(shù)據(jù)庫的數(shù)據(jù)交換。 本書專注于軟件設(shè)計中的模式。這里要注意它們的區(qū)別: * 架構(gòu)模式(architectural patterns)。 * 設(shè)計模式(design patterns)。 確定架構(gòu)模式和設(shè)計模式的界限參見3.3節(jié)。 用于設(shè)計的模式是已經(jīng)經(jīng)過證實的可用于解決一些特定問題的參考答案。在設(shè)計系統(tǒng)時要考慮使用模式,因為它們都是已經(jīng)在多個系統(tǒng)中被證明過的。 設(shè)計階段的模式起源于架構(gòu)師Christopher Alexander1。他在20世紀70年代整理總結(jié)了一套城市建設(shè)的模式。Christopher Alexander認識到,建筑或者整條街道雖然可能包括相同的元素,但是完全可以按照不同的模式建造。換句話說,他通過元素和它們之間典型的關(guān)系可以辨別模式。 “……除了元素之外,每個建筑都是由元素之間的關(guān)系組成的一定模式定義的……” [Ale77] 在城市建筑學(xué)中,模式是一個具有開創(chuàng)性意義的理念。但是它在建筑學(xué)中的流行和認可的程度遠遠不如在軟件開發(fā)領(lǐng)域。 模式對系統(tǒng)設(shè)計起到了重要的貢獻,它促使軟件開發(fā)在走向成熟的工程技術(shù)的道路上邁出了重要的一步。模式基本上是不依靠任何平臺,不被限制于一種固定的編程語言。被命名的模式擴展了專業(yè)技術(shù)語言,受過訓(xùn)練的開發(fā)人員可以在一個更高的抽象層次中理解一個問題和答案。 模式經(jīng)常要和抽象結(jié)合,它是一個抽象類或者接口的符號。真實的類是派生類,模式并不知道派生類,它們是由使用模式的用戶定義的。它們或者在編譯時出現(xiàn)在以具體類為基礎(chǔ)的模式中,或者是在運行時在面向?qū)ο竽J街刑娲J街械某橄? 部分。 為了使模式可以供其他開發(fā)者使用,必須做好文檔工作。模式不是發(fā)明出來的,而是在實際應(yīng)用中因為可以解決典型的問題而被發(fā)現(xiàn)出來的方法,它們可以在很多實際應(yīng)用中使用。 3.1節(jié)研究在軟件設(shè)計中模式的使用。3.2節(jié)描述在軟件設(shè)計中模式的屬性和它的設(shè)計。3.3節(jié)確定架構(gòu)模式、設(shè)計模式和慣用法相互的界限。在3.4節(jié)中介紹模板,本書中利用這個模板介紹如何給模式做文檔。 3.1 模式的使用 軟件設(shè)計中模式的主要目標是通過再次使用已經(jīng)獲得的經(jīng)驗提高架構(gòu)的靈 活性。 大部分系統(tǒng)設(shè)計中包含很多模式,僅僅通過這個特征還不能判斷這是一個好的設(shè)計。 這里Christopher Alexander使用了適當?shù)恼Z言:“建筑可能是通過松散排列的模式建造的。這樣的建筑只能體現(xiàn)出模式的聚集,并不具有內(nèi)部的一致性,它沒有真正的核心。還有一種模式結(jié)合的方式就是在同一空間的多模式疊加。這樣的建筑具有內(nèi)部的一致性,它把很多的含義包含在一個小的空間里。通過這種內(nèi)部的凝聚力使它具有核心力!币粋好的設(shè)計的形成,需要多個模式相互間完美地組合,形成疊加效應(yīng)。 只有在真正有意義的時候才可以使用模式。在使用模式之前,一定要仔細考慮要使用的模式是否適合解決這個問題,使用之后會產(chǎn)生什么樣的結(jié)果。 從開發(fā)者的角度認為模式具有一定的安全性。這種安全性是建立在事實的基礎(chǔ)上的,是前人經(jīng)過應(yīng)用已經(jīng)得到證實的結(jié)果。然而這容易形成誤導(dǎo),認為在任何情況下使用模式都是正確的選擇。單純使用模式并不能保證對于設(shè)計中出現(xiàn)的具體問題是有意義的。 在以對象為基礎(chǔ)的模式中委托原則經(jīng)常起到重要的作用。委托一個用于接收信息的對象,消息可以繼續(xù)傳遞給 * 接收信息的對象所聚集的部分對象; * 或者是在運行時實現(xiàn)一個抽象(接口或抽象類)的對象(這個抽象是由接收信息的對象實現(xiàn)的)。 使用任何形式的委托或者抽象,其代價都是降低系統(tǒng)的性能。額外增加的層次總是和降低系統(tǒng)的性能相聯(lián)系的。 如果要求系統(tǒng)具有擴展性,那么模式的使用具有優(yōu)勢。但是如果首先是對系統(tǒng)性能的要求,系統(tǒng)的可修改性沒有重要作用時,使用模式就要仔細考慮。 盡管使用模式可以提高架構(gòu)的可擴展性,但是同時也增加了架構(gòu)的復(fù)雜度。 為了保證可擴展性,可能會生成新的類和操作,或者是新的類和類之間的關(guān)系。這種復(fù)雜度會降低系統(tǒng)的性能,在這種情況下,復(fù)雜度所帶來的優(yōu)點并不能抵消性能降低的不足。 如果系統(tǒng)需要靈活性是推測的,即目前還不清楚系統(tǒng)將來是否需要,那么就應(yīng)該“只保持必要的靈活性,越少越好”。 本書關(guān)于模式的介紹,其核心是解釋如何解決問題。然而,這個問題的實質(zhì)是什么時候適合使用模式。這個問題往往被忽視了。也許沒有已知的模式可以達到預(yù)期的目標。 尋找解決具體設(shè)計問題的方法是艱難的,人們必須仔細研究待解決的問題,比較有關(guān)模式的性能。 3.2 模式的屬性和它的設(shè)計 模式的目標就是提高架構(gòu)的屬性。例如屬性包括下面兩點: * 可理解性; * 可擴展性。 可理解性可以通過簡易性達到,即通過為每個模式提供簡易的結(jié)構(gòu)化的全面文檔。可擴展性可以通過以下兩點實現(xiàn): * 靜態(tài)繼承。 * 使用聚合接口2或者是抽象類。 面向?qū)ο竽J綕M足以下設(shè)計原則: * 松耦合性系統(tǒng)(詳見1.5節(jié)),組件的松耦合性。 * 抽象(詳見1.2節(jié)),通過泛化、接口或者抽象類。 * 信息隱藏(詳見1.2節(jié)),通過隱藏程序?qū)崿F(xiàn)的部分。 * 明確的職責(zé)(詳見1.3節(jié)),通過角色安排。 * 依賴倒置原則,高層的類不依賴于低層的類。 這里需要強調(diào)的是有時候需要為非面向?qū)ο笙到y(tǒng)制定模式。這樣的模式不需要繼承和多態(tài)[Bus98,24頁]。模式不一定都是面向?qū)ο蟮。本書中所介紹的設(shè)計模式都是以面向?qū)ο鬄榛A(chǔ)的。 人們想到面向?qū)ο髸r,總會認為是通過泛化達到盡可能高的抽象,換句話說,就是找到它的基類,通過細分得到不同的變化。 因此一些模式就設(shè)計成以抽象類為基類,還有一些模式使用接口。人們更偏愛于使用接口,有兩個原因: (1)在一些編程語言中,例如Java,接口允許多重繼承,抽象基類則不允許。 (2)抽象基類可以包含抽象操作,也可以包含已經(jīng)完成的操作。接口則只能包含抽象操作,這樣更讓人一目了然。 接口優(yōu)于抽象類,但這并不總是成立的。如果人們在每個實現(xiàn)類中都必須實現(xiàn)一個聚集或者默認實現(xiàn),這種情況就應(yīng)該使用抽象類。 3.3 架構(gòu)模式、設(shè)計模式和慣用法的界限。 ……
你還可能感興趣
我要評論
|