軟件工程基礎(chǔ):第10章 軟件復(fù)用技術(shù)_第1頁
軟件工程基礎(chǔ):第10章 軟件復(fù)用技術(shù)_第2頁
軟件工程基礎(chǔ):第10章 軟件復(fù)用技術(shù)_第3頁
軟件工程基礎(chǔ):第10章 軟件復(fù)用技術(shù)_第4頁
軟件工程基礎(chǔ):第10章 軟件復(fù)用技術(shù)_第5頁
已閱讀5頁,還剩161頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第10章軟件復(fù)用技術(shù)軟件復(fù)用軟件復(fù)用早在20世紀50年代用機器語言編寫程序時就開始運用。作用:軟件復(fù)用通過充分利用已有開發(fā)成果,消除包括分析、設(shè)計、編碼、測試等在內(nèi)的許多重復(fù)勞動,極大地提高了軟件開發(fā)的效率。同時,通過復(fù)用高質(zhì)量的已有開發(fā)成果,避免了重新開發(fā)可能引入的錯誤,由此也保證了軟件的高質(zhì)量。

10.1軟件復(fù)用概述

所謂軟件復(fù)用是指利用已有的、對建立新系統(tǒng)有用的軟件制品來形成新系統(tǒng)的活動。目前,人們對軟件復(fù)用寄予厚望,認為其有可能成為突破軟件危機的一條出路。

10.1.1軟件復(fù)用目的

1、縮短軟件開發(fā)和維護的時間;2、降低軟件開發(fā)和維護的成本;3、保證軟件的可靠性;4、保證軟件的一致性;5、保護投資者的利益;…

10.1.2軟件復(fù)用的類型

軟件復(fù)用可以分為橫向復(fù)用和縱向復(fù)用兩種類型。橫向復(fù)用是指復(fù)用不同應(yīng)用領(lǐng)域中的軟件成份,如數(shù)據(jù)結(jié)構(gòu)、算法、人機界面構(gòu)件等。面向?qū)ο笤O(shè)計模式是一種典型的橫向復(fù)用機制。縱向復(fù)用是指在一類具有較多共性的應(yīng)用領(lǐng)域之間復(fù)用軟件成份。縱向復(fù)用活動的關(guān)鍵在于領(lǐng)域分析:根據(jù)應(yīng)用領(lǐng)域的特征和相似性,預(yù)測軟件成份的可復(fù)用性。一旦確認了軟件成份的可復(fù)用價值,便進行開發(fā),然后將開發(fā)得到的軟件制品存入可復(fù)用構(gòu)件庫,供未來開發(fā)項目使用。

10.1.3軟件復(fù)用的內(nèi)容

軟件復(fù)用的內(nèi)容,除了源程序代碼外,還有許多其它軟件制品,甚至特定的分析建模方法、檢查技術(shù)、質(zhì)量保證過程等,均可以被復(fù)用。C.Jones定義了10種可能復(fù)用的軟件制品:項目計劃、成本估計、體系結(jié)構(gòu)、需求模型和規(guī)格說明、設(shè)計、源代碼、用戶文檔和技術(shù)文檔、用戶界面、數(shù)據(jù)、測試用例。10.1.4針對復(fù)用的過程模型

領(lǐng)域分析領(lǐng)域設(shè)計(軟件體系結(jié)構(gòu)開發(fā))領(lǐng)域?qū)崿F(xiàn)(可復(fù)用軟件制品開發(fā))領(lǐng)域模型領(lǐng)域構(gòu)架可復(fù)用軟件制品庫領(lǐng)域知識領(lǐng)域工程系統(tǒng)分析規(guī)約&設(shè)計建造系統(tǒng)規(guī)約分析&設(shè)計模型應(yīng)用軟件用戶需求應(yīng)用工程10.1.5軟件復(fù)用成功實施的關(guān)鍵

管理者的支持;(復(fù)用影響了企業(yè)的組織結(jié)構(gòu)、文化和軟件技術(shù)等)復(fù)用支持組的建立;(承擔可復(fù)用軟件制品的建立、獲取、驗證、分類和管理)復(fù)用庫的創(chuàng)建;(復(fù)用庫用來對可復(fù)用軟件制品進行分類、組織、存儲和管理)復(fù)用驅(qū)動的方法支持。(一方面指導(dǎo)可復(fù)用制品的建立人員識別復(fù)用機會和侯選的可復(fù)用制品,并建立一個可復(fù)用制品,另一方面指導(dǎo)應(yīng)用軟件開發(fā)人員尋找可復(fù)用制品,并利用它們組裝成新的應(yīng)用。)10.1.6復(fù)用成熟度模型(IBM)成熟度等級復(fù)用比例過程復(fù)用制品范圍工具初始級沒有復(fù)用-20%至20%特定的過程子程序宏個人沒有庫監(jiān)控級原始的復(fù)用10%至50%項目級的過程模塊包小組非正式的數(shù)據(jù)庫協(xié)調(diào)級計劃的復(fù)用30%至40%標準的過程子系統(tǒng)模型框架部門有配置管理功能的數(shù)據(jù)庫計劃級正式的復(fù)用50%至70%大規(guī)模的復(fù)用應(yīng)用程序生成器現(xiàn)場復(fù)用庫牢固級領(lǐng)域分析80%至90%軟件組裝過程特定領(lǐng)域體系結(jié)構(gòu)公司一組特定領(lǐng)域復(fù)用庫的集合10.1.7針對復(fù)用的軟件項目組織

高層經(jīng)理支持者創(chuàng)建者復(fù)用者庫管理工具可復(fù)用制品庫存取分類、存儲檢索復(fù)用復(fù)用檢索規(guī)格可復(fù)用制品獎罰獎罰獎罰報告報告報告職責創(chuàng)建者負責從復(fù)用者手中接受可復(fù)用制品的設(shè)計規(guī)格說明,進行可復(fù)用制品的設(shè)計、實現(xiàn)和質(zhì)量控制,重點考慮可復(fù)用制品的可復(fù)用性。

復(fù)用者負責軟件系統(tǒng)開發(fā)任務(wù)。

復(fù)用支持者負責可復(fù)用制品的資格確認、質(zhì)量保證、分類和存儲。

高層經(jīng)理負責管理、組織和協(xié)調(diào)各類軟件復(fù)用活動,并處理所有與復(fù)用有關(guān)的事務(wù)性工作。

10.2領(lǐng)域工程

所謂領(lǐng)域是指一組具有相似或相近軟件需求的應(yīng)用系統(tǒng)所覆蓋的功能區(qū)域。領(lǐng)域工程則是為領(lǐng)域中的應(yīng)用工程建立基本能力和必備基礎(chǔ)的過程,它覆蓋了建立可復(fù)用軟件制品的所有活動。作用:領(lǐng)域工程有助于產(chǎn)生具有較高可復(fù)用性的軟件制品。同時,領(lǐng)域工程產(chǎn)生的領(lǐng)域模型和領(lǐng)域構(gòu)架有助于針對復(fù)用的開發(fā)。

10.2.1領(lǐng)域工程與應(yīng)用工程的關(guān)系

在單個應(yīng)用系統(tǒng)工程(簡稱應(yīng)用工程)的開發(fā)過程中,軟件開發(fā)人員的任務(wù)是在特定的條件下,針對一組特定的需求產(chǎn)生一組特定的設(shè)計和實現(xiàn)。領(lǐng)域工程對領(lǐng)域中的應(yīng)用系統(tǒng)進行分析,識別這些應(yīng)用系統(tǒng)的共同特征和可變特征,對刻畫這些特征的對象和操作進行選擇和抽象,形成領(lǐng)域模型,依據(jù)領(lǐng)域模型產(chǎn)生出領(lǐng)域中應(yīng)用系統(tǒng)共同具有的體系結(jié)構(gòu)DSSA或生成過程。并以此為基礎(chǔ)識別、開發(fā)和組織可復(fù)用制品。

領(lǐng)域工程和應(yīng)用工程是相互聯(lián)系的

一方面,領(lǐng)域工程的主要信息來源是通過應(yīng)用工程得到的現(xiàn)有系統(tǒng),包括需求規(guī)格說明、設(shè)計、實現(xiàn)等。另一方面,領(lǐng)域工程和應(yīng)用工程需要解決一些相類似的問題,如:如何獲取并表示用戶需求?如何設(shè)計并表示設(shè)計模型等。

領(lǐng)域工程要適用于一族系統(tǒng),而不只是一個系統(tǒng)。因此,領(lǐng)域工程比應(yīng)用工程要復(fù)雜,往往不能事先設(shè)計劃好,也很難實施管理。10.2.2領(lǐng)域工程過程

領(lǐng)域分析(目標主要是獲得領(lǐng)域模型)領(lǐng)域設(shè)計(目標是獲得領(lǐng)域構(gòu)架DSSA)領(lǐng)域?qū)崿F(xiàn)(主要目標是定義將需求翻譯到由可復(fù)制品創(chuàng)建的系統(tǒng)的機制)領(lǐng)域工程是一個反復(fù)的、逐漸精化的過程,在實施過程中都可能返回到以前的步驟,對以前的步驟得到的結(jié)果進行修改和完善后,再回到當前步驟。

10.2.3領(lǐng)域工程參與人員

領(lǐng)域?qū)<?/p>

(任務(wù):提供關(guān)于領(lǐng)域中應(yīng)用系統(tǒng)的需求規(guī)約和實現(xiàn)的知識,幫助組織規(guī)范的、一致的領(lǐng)域字典,幫助選擇樣本系統(tǒng)作為領(lǐng)域工程的依據(jù),復(fù)審領(lǐng)域模型、DSSA等領(lǐng)域工程產(chǎn)品,等等)領(lǐng)域分析員

(控制整個領(lǐng)域分析過程,進行知識獲取,將獲取的知識組織到領(lǐng)域模型中,根據(jù)現(xiàn)有系統(tǒng)、標準規(guī)范等驗證領(lǐng)域模型的準確性和一致性,維護領(lǐng)域模型。)領(lǐng)域工程參與人員領(lǐng)域設(shè)計人員(控制整個領(lǐng)域設(shè)計過程,根據(jù)領(lǐng)域模型和現(xiàn)有的系統(tǒng)開發(fā)出DSSA,驗證DSSA的準確性和一致性,建立領(lǐng)域模型和DSSA之間的聯(lián)系。)領(lǐng)域?qū)崿F(xiàn)員

(根據(jù)領(lǐng)域模型和DSSA,或者從頭開發(fā)可復(fù)用制品,或利用再工程技術(shù)從現(xiàn)有應(yīng)用系統(tǒng)中提取可復(fù)用制品,對可復(fù)用制品進行驗證,建立DSSA與可復(fù)用制品間的聯(lián)系。)10.2.4領(lǐng)域模型

領(lǐng)域模型描述了領(lǐng)域中一些基本的概念,如功能、特性、數(shù)據(jù)、對象類和需求,以及這些概念間的相互關(guān)系,是領(lǐng)域內(nèi)系統(tǒng)的通用和差異屬性、屬性和領(lǐng)域概念的意義以及差異屬性之間的依賴性的明確表示。

領(lǐng)域定義

通過給出領(lǐng)域內(nèi)已有系統(tǒng)的例子、反例(領(lǐng)域外的系統(tǒng))以及有關(guān)規(guī)則(例如,“任何具有某能力X的系統(tǒng)屬于該領(lǐng)域”)來定義領(lǐng)域的范圍。它也給出了接納或拒絕接納一個給定系統(tǒng)或功能的基本原理。

領(lǐng)域字典和概念模型領(lǐng)域字典:定義領(lǐng)域詞匯。

概念模型:以某種合適的方式,例如對象圖、類圖、交互圖、狀態(tài)轉(zhuǎn)換圖或?qū)嶓w關(guān)系圖或數(shù)據(jù)流圖等,和非正式文本來描述領(lǐng)域內(nèi)的概念。

特征模型

定義一組可重用的和可配置的需求,用于指定一個領(lǐng)域內(nèi)的系統(tǒng)。

特征和特征模型最初由FODA(FeatureOrientedDomainAnalysis,面向特征的領(lǐng)域分析)方法引入的。

在FODA中,特征是指系統(tǒng)的一個最終用戶可見的特性。例如,汽車的傳動裝置是自動的或手動的。

特征模型由特征圖、特征定義、特征組合規(guī)則和特征原理(特征的選擇與不選擇原因)等組成。

例子(FODA)汽車傳動裝置馬力空調(diào)手動自動二者選一必需的可選的組合規(guī)則:“空調(diào)”需要“馬力”大于105特征原理:“手動”可以使燃燒效率更高10.2.5領(lǐng)域構(gòu)架

領(lǐng)域構(gòu)架是使用可復(fù)用制品來構(gòu)造領(lǐng)域中應(yīng)用系統(tǒng)的高層設(shè)計模型(軟件構(gòu)架)。

軟件構(gòu)架(softwarearchitecture):抽象地說,軟件構(gòu)架描述了構(gòu)建系統(tǒng)的元素、元素間的交互、指導(dǎo)元素組合的模式以及對這些模式的限制。管道/過濾器模式和層次體系結(jié)構(gòu)模式是兩種典型的軟件構(gòu)架模式。

管道/過濾器模式結(jié)構(gòu)每個構(gòu)件都有一組輸入和輸出,構(gòu)件讀輸入的數(shù)據(jù)流,經(jīng)過內(nèi)部處理,然后產(chǎn)生輸出數(shù)據(jù)流。

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

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

層次體系結(jié)構(gòu)模式結(jié)構(gòu)

每一層為上層服務(wù),并作為下層客戶;內(nèi)部的層只對相鄰的層可見;連接件通過決定層間如何交互的協(xié)議來定義。驗證密鑰管理

文件接口密碼層用戶最內(nèi)層是密碼層,包括加密和解密的功能,用于系統(tǒng)最基本的加密策略。第二層是文件級的接口,即加密和解密一個文件。第三層是密鑰管理,它允許一個組件在一份文件上簽名,證實簽名后,計算出一個散列碼作為訪問這個文件的權(quán)限限制。最后,第四層提供驗證,這一層管理一個密碼文件,這個文件以加密形式存儲,并且要求用戶輸入身份驗證(比如用戶名)和密碼。

客戶機/服務(wù)器體系結(jié)構(gòu)(2層)

數(shù)據(jù)存儲在集中式管理的服務(wù)器中,客戶機則負責數(shù)據(jù)處理和用戶界面的表示。由客戶提出一個服務(wù)的請求,然后由服務(wù)器響應(yīng)這個請求。

不足:復(fù)用受限于特定的數(shù)據(jù)庫格式;數(shù)據(jù)處理邏輯改變困難;…。用戶界面數(shù)據(jù)存儲數(shù)據(jù)處理客戶服務(wù)器r三層體系結(jié)構(gòu)

兩層模型的一種修改方案。用戶層用于向用戶顯示系統(tǒng)中的數(shù)據(jù)并允許用戶輸入和編輯數(shù)據(jù)。

業(yè)務(wù)邏輯層用于執(zhí)行業(yè)務(wù)功能和數(shù)據(jù)規(guī)則。業(yè)務(wù)邏輯層為用戶層提供服務(wù)。

數(shù)據(jù)存取服務(wù)封裝了底層的數(shù)據(jù)存儲的信息。

用戶接口用戶服務(wù)數(shù)據(jù)存取服務(wù)數(shù)據(jù)存儲數(shù)據(jù)層業(yè)務(wù)邏輯層用戶層業(yè)務(wù)服務(wù)層次體系結(jié)構(gòu)模式的特點支持基于抽象程度遞增的系統(tǒng)設(shè)計,使設(shè)計者可以把一個復(fù)雜系統(tǒng)按遞增的步驟進行分解;依賴性局部化,因為每一層至多和相鄰的上下層交互,因此功能的改變最多影響相鄰的上下層;支持重用只要提供的服務(wù)接口定義不變,同一層的不同實現(xiàn)可以交換使用,這樣,就可以定義一組標準的接口,而允許各種不同的實現(xiàn)方法。

層次體系結(jié)構(gòu)模式的不足并不是每個系統(tǒng)都可以很容易地劃分為分層的模式,甚至即使一個系統(tǒng)的邏輯結(jié)構(gòu)是層次化的,出于對系統(tǒng)性能的考慮,系統(tǒng)設(shè)計人員不得不把一些低級或高級的功能綜合起來;很難找到一個合適的、正確的層次抽象方法;當某個層次的構(gòu)成和行為發(fā)生變化時會產(chǎn)生連鎖反應(yīng)。

FODA方法領(lǐng)域分析由卡內(nèi)基·梅隆大學的軟件工程研究所提出的領(lǐng)域工程方法。它支持對某領(lǐng)域中系統(tǒng)共性和個性的發(fā)現(xiàn)、分析和文檔記錄。步驟:上下文分析;領(lǐng)域建模;構(gòu)架建模。上下文分析

上下文分析的目標是定義領(lǐng)域的范圍。在這個步驟中要分析領(lǐng)域與外部元素間的關(guān)系,例如不同的操作環(huán)境,不同的數(shù)據(jù)需求等。還要對可變性進行評價。上下文分析的結(jié)果是上下文模型。

屏幕管理系統(tǒng)上下文模型領(lǐng)域建模

根據(jù)領(lǐng)域范圍,分析領(lǐng)域中應(yīng)用系統(tǒng)的共性和差異,并建立領(lǐng)域模型,主要包括以下三種活動:特征分析:獲得客戶或最終用戶對一類系統(tǒng)的一般能力的理解,即特征。信息分析:定義和分析為實現(xiàn)領(lǐng)域中應(yīng)用所需的領(lǐng)域知識和數(shù)據(jù)需求。

操作分析:識別領(lǐng)域中應(yīng)用的行為特征。例子:屏幕管理系統(tǒng)特征圖之一例子:屏幕管理系統(tǒng)信息模型

操作分析選擇特征的處理方法1:每個特征分開方法2:采用參數(shù)分開方法3:采用繼承分開構(gòu)架建模

構(gòu)架建模為領(lǐng)域中的應(yīng)用提供軟件解決方案,其焦點是識別并發(fā)進程和面向領(lǐng)域的共同模塊。

屏幕管理系統(tǒng)體系結(jié)構(gòu)FODA活動與產(chǎn)品其它方法ODM(OrganizationDomainModeling,組織領(lǐng)域建模),由Synquiry有限公司的MarkSimos開發(fā)。Draco,由JamesNeighbors在其博士研究工作中開發(fā)。DSSA方法、DARE方法、代數(shù)方法等等。傳統(tǒng)軟件工程與領(lǐng)域工程的比較

軟件工程

領(lǐng)域工程需求分析為特定系統(tǒng)制作需求領(lǐng)域分析對一組系統(tǒng)制作可復(fù)用、可定制的需求系統(tǒng)設(shè)計為特定系統(tǒng)進行設(shè)計領(lǐng)域設(shè)計制作用于一組系統(tǒng)的可復(fù)用的設(shè)計系統(tǒng)實現(xiàn)得到一個系統(tǒng)產(chǎn)品領(lǐng)域?qū)崿F(xiàn)制作可復(fù)用的組件、內(nèi)部結(jié)構(gòu)和制作過程10.3組件技術(shù)概述

我們能如此開發(fā)軟件嗎?10.3.1組件的定義與復(fù)用

組件(Component),亦稱構(gòu)件,是指語義完整、語法正確和有可重用價值的單位軟件,它是語義描述、通信接口和實現(xiàn)代碼的復(fù)合體。簡單地說,組件是具有一定的功能,能夠獨立工作或能同其它組件裝配起來協(xié)調(diào)工作的程序體,其使用同它的開發(fā)、生產(chǎn)無關(guān)。組件可分為源代碼組件和二進制代碼組件。

可復(fù)用組件應(yīng)具備的屬性

①有用性——組件必須提供有用的功能;②可用性——組件必須易于理解和使用;③質(zhì)量——組件及其變形必須能正確工作;④適應(yīng)性——組件應(yīng)該易于通過參數(shù)化等方式在不同語境中進行配置;⑤可移植性——組件應(yīng)能在不同的硬件運行平臺和軟件環(huán)境中工作。

組件復(fù)用方式組件復(fù)用有白盒和黑盒兩種方式。黑盒是指不作修改的直接引用;白盒指進行適應(yīng)性修改的引用。源代碼在大多數(shù)情況下是指適應(yīng)性修改地引用;二進制代碼組件的復(fù)用只能采用黑盒方式,通常只能了解組件的接口和屬性等信息。

10.3.2組件模型

組件模型通常由基于各種語言開發(fā)工具、組件嵌入機制和相關(guān)服務(wù)(事務(wù)、安全、認證、負載均衡等)組成。

比較成熟的組件模型有OMG的CORBA、SUN的EJB(JavaBean)和Microsoft的COM/DCOM/COM+。

三種組件模型間的差別

COM為組件交互定義了一個二進制的標準,只是Windows平臺上廣泛采用的模型。CORBA可以運行在多種不同操作系統(tǒng)上,與平臺和語言無關(guān),但它不是一個二進制的標準。EJB(EnterpriseJavaBeans)是一個服務(wù)器端組件模型,JavaBeams是一個可供使用的組件,主要用于構(gòu)建客戶端軟件并特別考慮了GUI組件的需要。EJB和CORBA兼容,并可能相互促進。由于EJB要求所有組件都要用Java編寫,而Java必須運行在Java虛擬機上,從而會導(dǎo)致Java很難與非Java代碼實現(xiàn)緊密集成。

10.3.3組件獲取與描述

通??梢圆捎靡韵峦緩絹慝@取組件:從現(xiàn)存組件中獲取得符合要求的組件,直接使用或作適應(yīng)性修改,得到可復(fù)用的組件;通過遺產(chǎn)工程,將具有潛在復(fù)用價值的組件提取出來,得到可復(fù)用的組件;從市場上購買現(xiàn)成的商業(yè)組件,即COTS(CommercialOff-The-Shelf,商業(yè)現(xiàn)貨)組件;開發(fā)新的符合要求的組件。

組件獲取后,可對它進行結(jié)構(gòu)化組織并放入可復(fù)用組件庫,以備復(fù)用。組件描述

屬性。描述了組件的特征。屬性值對外可以讀出,也可以修改。功能接口。即組件向外提供的服務(wù)。依賴關(guān)系。指出組件在實例化時所依賴的其它組件的特定接口,是組件完成其任務(wù)所必需的。

10.3.4組件分類

關(guān)鍵詞分類用戶界面窗口菜單對話框事件處理圖形窗口文本窗口信息對話框數(shù)據(jù)錄入對話框拖放處理鍵盤事件處理多面分類方式

10.3.5組件檢索

基于關(guān)鍵詞的檢索(在圖形用戶界面上將可復(fù)用組件庫的關(guān)鍵詞樹直觀地顯示給用戶,用戶通過逐級瀏覽關(guān)鍵詞樹尋找需要的關(guān)鍵詞并提取相應(yīng)的組件;或直接輸入含通配符的關(guān)鍵詞由系統(tǒng)自動給出合適的候選組件清單,用戶選擇并提取相應(yīng)的組件。);多面檢索(構(gòu)造查詢、檢索組件、排序組件)。上述兩種檢索方法均基于語法匹配,這要求使用者對組件庫中的有關(guān)詞匯有較全面的把握和較精確的理解。理想的檢索方法是語義匹配:組件庫的用戶以形式化的手段描述所需組件的功能或行為的語義,系統(tǒng)通過定理證明或基于知識的推理來尋找語義上等價的或相近的組件。

10.3.6組件使用

理解組件(①組件的功能與行為;②相關(guān)的領(lǐng)域知識;③可適應(yīng)性約束條件與例外情形;④可以預(yù)見的修改部分及修改方法);修改組件;合成組件(基于功能的合成技術(shù):調(diào)用與參數(shù)傳遞、基于數(shù)據(jù)的合成技術(shù):調(diào)用與參數(shù)傳遞、面向?qū)ο蟮暮铣杉夹g(shù):繼承)。10.4公共對象請求代理體系結(jié)構(gòu)

公共對象請求代理體系結(jié)構(gòu)(CommonObjectRequestBrokerArchitecture,CORBA)是由對象管理組織OMG制定的一個工業(yè)規(guī)范,其主要目標是提供一種機制,在此基礎(chǔ)上,對象可以透明地請求和獲得應(yīng)答。CORBA的實質(zhì)是遠過程調(diào)用與面向?qū)ο蠹夹g(shù)的有機結(jié)合。

OMG于1990年制訂了OMA(ObjectManagementArchitecture),它可用任何方法來實現(xiàn),CORBA是其中的一種實現(xiàn)方案。

OMA(層次結(jié)構(gòu))OSORBServicesFacilitiesDomainObjectsObjectsObjectsObjectsObjects10.4.1CORBA的組成

客戶程序(Client)對象實現(xiàn)(Server)動態(tài)調(diào)用接口靜態(tài)IDL存根ORB接口動態(tài)骨架接口靜態(tài)IDL骨架對象適配器ORB核GIOP/IIOP接口存儲數(shù)據(jù)庫實現(xiàn)存儲數(shù)據(jù)庫ORB核/ORB接口

ORB(ObjectRequestBroker)該是作為對象互通信的軟總線。ORB截獲服務(wù)請求調(diào)用,然后識別網(wǎng)絡(luò)中服務(wù)器的位置,即對象實現(xiàn)的位置。若服務(wù)器不在運行,則ORB啟動服務(wù)器,并一直等待到它準備接受服務(wù)請求為止。

ORB接口是ORB核給出的接口,同時為客戶和對象實現(xiàn)方所見,提供了一些只能由ORB核提供的服務(wù):對象引用操作、ORB初始化、對象適配器初始化和獲取初始對象引用。

ORB之間的互操作則采用GIOP和IIOP實現(xiàn)。

ORB的特性可使客戶程序不用考慮:服務(wù)器編程語言、服務(wù)器平臺、服務(wù)器地點和網(wǎng)絡(luò)協(xié)議。

ORB提供了兩個用于存儲有關(guān)對象信息的服務(wù):接口倉庫(接口存儲數(shù)據(jù)庫)和實現(xiàn)倉庫(實現(xiàn)存儲數(shù)據(jù)庫)。

IDLIDL(InterfaceDefinitionLanguage)是用于說明對象接口的標識語言。作用:接口概念一方面把對象的使用與對象的實現(xiàn)徹底分開;另一方面ORB使用對象的接口描述可在異類環(huán)境下實現(xiàn)不同數(shù)據(jù)格式的轉(zhuǎn)換;第三,IDL編譯程序能把接口描述直接映射到目標語言,極大地加快了代碼開發(fā)。

例子

ModuleShapes{interfaceRectangle{attributeIntegerlength;attributeintegerwidth;integerarea();voiddraw();

voidtranslate(inintegerX,inintegerY);}interfaceSquareRectangle{}}

module用來引入一層作用域;Interface集中一些相關(guān)的操作;attribute標識了具有g(shù)et/set存取器函數(shù)對的數(shù)據(jù)成員;in表輸入;out表輸出;inout表輸入輸出。

IDL編譯由IDL編譯器根據(jù)IDL代碼生成相應(yīng)編程語言的客戶代理(骨架)和服務(wù)器代理(存根)對象等。

靜態(tài)調(diào)用

靜態(tài)調(diào)用是指通過靜態(tài)IDL存根和靜態(tài)IDL骨架進行的調(diào)用過程。靜態(tài)IDL存根對客戶端來說可看作它的遠端對象,即服務(wù)器代理;靜態(tài)IDL骨架對對象實現(xiàn)來說可看作它的客戶端,即客戶代理。靜態(tài)調(diào)用必須在編譯時就知道特定的目標對象的接口信息。靜態(tài)IDL存根和靜態(tài)IDL骨架由編譯IDL接口定義語言文件得到。

客戶端ORB請求靜態(tài)IDL存根打包請求(源編程語言格式樣→傳輸格式)ORB傳遞且激合對象實現(xiàn)靜態(tài)IDL骨架解包(傳輸格式→目的編程語言格式)對象實現(xiàn)動態(tài)調(diào)用

動態(tài)調(diào)用接口(DynamicInvocationInterface,DII)和動態(tài)骨架接口(DynamicSkeletonInterface,DSI)可分別被視為通用存根和通用骨架,它們由ORB直接提供不依賴于所調(diào)用對象的接口。

客戶端運期間發(fā)請求DII根據(jù)接口庫提供的IDL接口信息通過函數(shù)Create-request動態(tài)創(chuàng)建對象請求ORB傳遞DSI從進入的消息中找出調(diào)用的目標對象及相應(yīng)的方法,并提供運行時的連接機制對象實現(xiàn)對象適配器

對象適配器是ORB與對象實現(xiàn)間的接口,其主要的工作如下:

對象實現(xiàn)的注冊;生成及管理對象引用;服務(wù)器進程激活;對象激活/撤銷/向上調(diào)用。10.4.2ORB運行機制

1.開始;2.客戶獲取特定對象實現(xiàn)的對象引用;3.如果對象以靜態(tài)方式實現(xiàn),則通過IDL存根向?qū)ο髮崿F(xiàn)發(fā)出請求,然后轉(zhuǎn)6;4.將請求發(fā)給ORB提供的DII;5.DII根據(jù)接口庫的信息將請求傳遞給對象實現(xiàn);6.ORB傳遞請求;7.ORB內(nèi)核在請求到達后做一定的處理,然后將其送給對象實現(xiàn)登記的對象適配器;8.對象適配器接收請求;9.如果不是本ORB域登記,則轉(zhuǎn)13;10.如果有相應(yīng)的IDL骨架存在,則對象適配器通過IDL骨架調(diào)用對象實現(xiàn)中的方法,并轉(zhuǎn)17;11.對象適配器通過DSI調(diào)用對象實現(xiàn)方法;12.轉(zhuǎn)17;13.將請求傳給DSI;14.DSI產(chǎn)生一個代理對象;15.代理對象將請求轉(zhuǎn)成中間協(xié)議表示形式傳給目的ORB;16.目的ORB將中間協(xié)議表示形式轉(zhuǎn)換成本地DII請求,以實現(xiàn)對對象實現(xiàn)中的方法進行調(diào)用;17.將結(jié)果按原路返回給客戶;

10.4.3基于CORBA的軟件開發(fā)

①編寫OMG定義的IDL接口規(guī)范說明文件,描述服務(wù)對象所支持的操作和類型;②編譯IDL規(guī)格說明文件,生成客戶端存根和服務(wù)器端骨架;③編寫對象實現(xiàn)程序;④編寫服務(wù)器和客戶主程序結(jié)構(gòu);⑤將對象實現(xiàn)程序,服務(wù)主程序和生成的服務(wù)器骨架編譯連接成服務(wù)端可執(zhí)行程序;⑥將客戶端主程序和生成的客戶端存根編譯連接成客戶端可執(zhí)行程序,且若服務(wù)器端是基于Web和瀏覽器方式的,則相應(yīng)地編寫HTML超文本文件,鏈入編寫的客戶方JavaApplet小程序;⑦分別運行服務(wù)器端和客戶端程序。

10.4.4CORBA的特點

同時支持分布計算技術(shù)和面向?qū)ο蠹夹g(shù)。支持許多現(xiàn)存的語言并把這些語言混合到一個分布式應(yīng)用系統(tǒng)之中。

代理機制使得客戶端程序和服務(wù)器端程序完全分離,這樣服務(wù)器端和客戶端程序都可自由地修改而無需通知對方。

提供了“軟件總線”的功能,實現(xiàn)了軟件組件的即插即用。

提供了一種高度的互操作性,保證了建立在不同CORBA產(chǎn)品之上的分布式樣對象能夠相互通信。

10.5組件對象模型

組件對象模型(ComponentObjectModel,COM)是微軟(Microsoft)的組件軟件方案,是為組件的互操作而定義的二進制組件模型。分布式組件對象模型(DistribntedComponentObjectModel,DCOM)是COM的一個分布式擴充,是在分布式計算環(huán)境的遠程過程調(diào)用的基礎(chǔ)上開發(fā)的。COM+是按COM的標準建立的,并組合了一些工具的新版本,如MTS(MicrosoftTransactionServer)、MSMQ(MicrosoftMessageQueues)等。

10.5.1COM標準

COM作為一面向?qū)ο蟮木幊棠P?,目的是提高軟件的交互協(xié)同工作能力,而不受開發(fā)語言和方法、運行環(huán)境和地點的限制。

在Windows系統(tǒng)平臺上,一個COM組件或是一個DLL文件,或是一個EXE文件。

一個組件程序可以包含多個COM對象,每個COM對象可以實現(xiàn)多個接口。COM組件COM對象COM對象COM接口COM接口COM對象

在COM規(guī)范中,并沒有對COM對象進行嚴格的定義。COM對象同C++語言中的類一樣,也包括屬性和方法。屬性反映了對象的狀態(tài),方法則是對象提供給外界的接口,客戶必須通過接口才能獲得對象的服務(wù)。COM對象以提供功能服務(wù)為主,可用來替代傳統(tǒng)的API(ApplicationProgrammingInterface)函數(shù)。

COM對象標識客戶并不直接訪問COM組件,而是通過一個全局標識符進行對象的創(chuàng)建和初始化工作。在COM的規(guī)范中,每個對象有一個128位的全局惟一標識符GUID(GloballyUniqueIdentifier)來標識,稱為CLSID(ClassIdentifier)。(GUID不是專門用來定義COM對象標識符的,且GUID是一個隨機數(shù))COM庫提供了一個API函數(shù)產(chǎn)生GUID:

HRESULTCoCreateGuid(GUID*pguid);COM對象與C++對象的不同封裝性:COM對象只能通過其提供的接口成員函數(shù)訪問對象屬性;而C++有可能直接訪問對象中的數(shù)據(jù)成員。可重用性:COM通過包容或聚合實現(xiàn)重用;而C++主要通過繼承實現(xiàn)重用。客戶對象B對象AISomeInterfaceISomeInterfaceIOtherInterface客戶對象B對象AISomeInterfaceIOtherInterface包容聚合COM接口

COM規(guī)范的核心內(nèi)容是關(guān)于接口的定義。

COM接口有兩種:標準接口和用戶接口,用戶接口是用戶為COM對象設(shè)計的接口。標準接口是COM規(guī)范定義的,可用來訪問有關(guān)COM對象的信息。

在標準接口中,所有COM對象都預(yù)定要執(zhí)行IUnknown接口。如果要支持后期綁定,則需要IDispatch接口,其它還有與一組存儲有關(guān)的IPersist系列接口。

接口結(jié)構(gòu)類似于COM對象的標識,COM接口也采用GUID,稱為IID(interfaceidentifier).客戶使用一個COM對象的接口,必須知道接口的IID和接口提供的方法。接口指針PVtable指針指向功能1指向功能2…對象實現(xiàn)Vtable(virtualfunctiontable)(供客戶使用)標準接口IUnknownQueryInterface返回COM對象可否提供有關(guān)的接口服務(wù);函數(shù)輸入為接口標識符。如果COM對象實現(xiàn)了該接口,則返回接口指針,否則返回空。AddRef和Release調(diào)用并處理COM對象引用計數(shù)器,用于管理COM對象的生命周期,每當創(chuàng)建一個新的對已有COM對象的引用時,AddRef方法便被調(diào)用,從而將COM對象引用計數(shù)加1。當客戶不再需要時,通過Release將引用計數(shù)減1,當引用計數(shù)減到0時,對象便清除自己。

接口定義語言(MIDL)微軟用其接口定義語言MIDL來精確定義接口,每一接口中的方法以及每一方法的參數(shù)。MicrosoftVC++提供了MIDL工具,可把IDL接口描述文件(*.idl)編譯成C/C++語言兼容的接口描述頭文件(*·h)供組件程序和客戶程序使用。

例子定義接口,并用MIDL編譯實現(xiàn):QueryInterface實現(xiàn):AddRef和Release實現(xiàn)用戶接口COM庫

在MicrosoftWindows操作系統(tǒng)環(huán)境下,COM庫以DLL文件的形式存在,其中包括以下幾項內(nèi)容:提供少量的API函數(shù),用來加速客戶和服務(wù)器COM應(yīng)用程序的創(chuàng)建;完成對象實現(xiàn)的定位服務(wù)。它根據(jù)唯一的類標識,通過系統(tǒng)注冊表來確定類和服務(wù)器實現(xiàn)的地址。實現(xiàn)透明的遠過程調(diào)用,以支持在本地或遠程服務(wù)器中運行的對象。提供一套應(yīng)用程序如何控制其進程空間里內(nèi)存的分配和釋放的標準機制。

COMAPI函數(shù)定位服務(wù)(方法1)COM庫注冊表組件程序如果是EXE,則會有一點點不同系統(tǒng)注冊表信息(windows2000)組件向系統(tǒng)注冊代碼同樣也應(yīng)有清除注冊用代碼!也可手工操作注冊表完成!類工廠(實現(xiàn)IClassFactory接口)用于控制組件的生存周期用于創(chuàng)建COM對象獲取類工廠10.5.2COM客戶/服務(wù)器模型客戶服務(wù)器進程內(nèi)調(diào)用在進程內(nèi),服務(wù)器組件和客戶程序運行在同一地址空間中,一旦客戶程序與組件程序建立通信關(guān)系,客戶程序就可以通過得到的接口指針直接調(diào)用服務(wù)器對象的成員函數(shù)。

接口指針PVtable指針指向功能1指向功能2…對象實現(xiàn)Vtable(virtualfunctiontable)例子本地調(diào)用在同一機器上的不同進程,COM采用了本地過程調(diào)用LPC(LocalProcedureCall)實現(xiàn)進程外組件與客戶程序的通信。圖中虛線表明,對開發(fā)人員而言,不需考慮底層細節(jié),COM實現(xiàn)了進程模型的透明,使得客戶程序調(diào)用接口成員函數(shù)好像是直接進行的。

10.5.3分布式COM(DCOM)

對于組件程序與客戶程序不在同一主機的情形,DCOM則把COM的進程模型的透明性拓展為位置透明性,把COM中本地跨進程(同一主機不同進程)通信用一個網(wǎng)絡(luò)協(xié)議傳輸過程來替代,組件程序和客戶程序均感覺不到中間發(fā)生的過程,只是中間數(shù)據(jù)傳遞的路線更長一些。

10.5.4COM+簡介

COM+COM+目錄負載平衡內(nèi)存數(shù)據(jù)庫對象池隊列組件新的事件模型組件管理和配置MTS事務(wù)支持資源分發(fā)管理安全模型易化管理COM/DCOM基于接口的編程遠程支持基本組件服務(wù)分布式組件服務(wù)10.6EJB模型

1996年10月,SUN公司推出JavaBean。按SUN公司的定義,JavaBean是一種能在編程工具中被可視化處理的可復(fù)用的軟件組件。EJB規(guī)范是SUN公司于1997年12月發(fā)布的JavaBean組件模型。JavaBean組件是一種可用來組裝應(yīng)用程序的組件,不是一個完整的應(yīng)用程序,不能部署;EJB組件則是可部署的組件,用來完成服務(wù)器端的操作,需要賴以生存的運行環(huán)境,需初始化和提供其它服務(wù)的容器,而JavaBean則不需要。

10.6.1JavaBean組件模型

JavaBean組件JavaBean組件JavaBean組件JavaBean組件JDBCJava服務(wù)器CORBA服務(wù)器數(shù)據(jù)庫服務(wù)器RMIIIOP數(shù)據(jù)庫協(xié)議InfoBusJavaBean框架JavaBeans和類庫的關(guān)系JavaBeans適合可以可視化地操作從而完成某項功能的軟件。如:按鈕、標簽等。類庫適合于對程序員提供一些功能,但并不太適合進行可視化操作的模塊。如訪問JDBC數(shù)據(jù)庫的接口。JavaBeans與外部接口一個JavaBeans組件主要通過屬性、方法和事件來與外部環(huán)境進行交互。JavaBeans屬性反映了組件的特征。JavaBeans引入了聯(lián)系和約束屬性。一個聯(lián)系屬性當其值改變時通知其他對象;一個約束屬性值的改變可以被其他組件否決。JavaBeans自查自查(內(nèi)?。┦窃谶\行時發(fā)現(xiàn)JavaBeans組件的屬性、方法和事件的過程。兩種方式:通過尋找遵循某種命名模式的類和方法(隱式提供信息);通過查詢某個類的BeanInfo。JavaBeans組件開發(fā)(JBuilder6)創(chuàng)建JavaBeans組件建立一個工程文件(File/NewProject);建立一個JavaBean類(File/New);設(shè)計界面(用戶窗口的Design標簽);添加屬性和事件;編譯成Class文件;打包成JAR文件(Wizards/ArchiveBuilder).注冊JavaBeans組件(Tools/ConfigurePalette-AddComponent)按SelectLibrary按鈕;選Project后按New按鈕;按Add,選中打包后的文件名;按AddFromSelectedLibrary;按OK退出。//此后便可如同Jbutton一樣使用創(chuàng)建的組件10.6.2EJB體系結(jié)構(gòu)

EJB容器本地接口遠程接口實體BeanEJB容器本地接口遠程接口會話BeanJavaServelets或JavaServerPages或JavaApplication(RMI)客戶端數(shù)據(jù)庫EJB結(jié)構(gòu)要素EJB服務(wù)器是管理EJB容器的高端進程或應(yīng)用程序,由開發(fā)商提供。EJB本地接口為客戶創(chuàng)建、刪除、查找EJB遠程接口對象的句柄提供相應(yīng)的操作。本地對象是由EJB容器產(chǎn)生的對本地接口的實現(xiàn),用來創(chuàng)建EJB對象。EJB遠程接口為EJB提供特定的業(yè)務(wù)客戶接口方法。EJB對象是由容器產(chǎn)生的對遠程接口的實現(xiàn),所有客戶端的調(diào)用都要訪問EJB對象,EJB對象將調(diào)用委托給實體Bean(或會話Bean)的實例。會話Bean包含與商務(wù)處理相關(guān)的邏輯實現(xiàn)。實體Bean提供對企業(yè)數(shù)據(jù)的訪問。

本地接口和本地對象EJB容器和服務(wù)器本地對象EJB對象EJB客戶端程序3:返回EJB對象引用1:創(chuàng)建一個新的EJB對象

本地接口

遠程接口2:創(chuàng)建EJB對象遠程接口和EJB對象EJB容器和服務(wù)器EJB對象EJB客戶端程序5:返回結(jié)果1:調(diào)用一個方法事務(wù)服務(wù)安全服務(wù)2:調(diào)用J2EE服務(wù)4:方法返回3:調(diào)用BeanEJB運行機制基于組件的應(yīng)用開發(fā)中的有關(guān)角色10.7可復(fù)用面向?qū)ο笤O(shè)計模式

面向?qū)ο笤O(shè)計模式最初出現(xiàn)于70年代末80年代初。1987年W.Cunningham和K.Beck引入建筑師C.Alexander的模式概念。

面向?qū)ο笤O(shè)計模式是普通面向?qū)ο笤O(shè)計問題的解決方案,這類問題以一組交互類的形式出現(xiàn),用戶根據(jù)需要定制這些交互類以形成專門的設(shè)計。作用:設(shè)計模式不僅使人們可以更加方便地復(fù)用成功設(shè)計方案,也能提高已有系統(tǒng)的文檔管理和系統(tǒng)維護的有效性。

10.7.1設(shè)計模式的描述與分類

一個設(shè)計模式事實上是系統(tǒng)地命名、解釋和評價某一重要的可重現(xiàn)的面向?qū)ο笤O(shè)計方案。所有設(shè)計均可從四個方面加以描述:模式名稱:用一至兩個詞描述設(shè)計問題、解決方案和效果。模式名稱便于使用者在更高的抽象層次上進行設(shè)計并交流有關(guān)設(shè)計思想。問題描述:指明使得設(shè)計模式可以被應(yīng)用所必須存在的環(huán)境條件。它解釋了設(shè)計問題及其背景。解決方案:描述了設(shè)計方案的組成部分,它們之間的關(guān)系及各自的職責和協(xié)作方式。效果:描述應(yīng)用設(shè)計模式后的結(jié)果及使用模式應(yīng)權(quán)衡的問題。

Gamma分類類別設(shè)計模式名稱意圖簡要說明創(chuàng)建型模式抽象工廠(AbstractFactory)提供創(chuàng)建相關(guān)的或相互依賴的一族對象的接口而無需指定具體的類。生成器

(Builder)將一個復(fù)雜對象的創(chuàng)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。工廠方法

(FactoryMethod)定義一個用于創(chuàng)建對象的接口,由子類決定實例化哪一個類。原型(Prototype)使用一個原型指定要創(chuàng)建的類的類型,通過拷貝這個原型得到新的對象。單件

(Singleton)保證一類僅有一個實例,并提供一個全局性的訪問點。Gamma分類結(jié)構(gòu)型模式適配器

(Adapter)將一個類的接口轉(zhuǎn)換成用戶希望得到的另一種接口,使原來由于接口不相容而不能一起工作的類可一起工作。橋(Bridge)將類的抽象部分與它的實現(xiàn)部分分離,使它們可以相互獨立地變化。組合(Composite)將對象組成樹結(jié)構(gòu)來表示局部和整體的層次關(guān)系,使單個對象和組合對象的使用具有一致性。裝飾

(Decorator)動態(tài)地給一個對象添加新功能。外觀

(Fa?ade)給一個子系統(tǒng)的所有接口提供一個統(tǒng)一接口,使子系統(tǒng)便于使用。輕量

(Flyweight)運用共享技術(shù)有效地支持大量細粒度對象。類別設(shè)計模式名稱意圖簡要說明Gamma分類行為模式職責鏈

(ChainofResponsibility)將多個接收請求的對象連成一條鏈,并沿鏈傳遞請求,直到有一個對象處理它為止。避免了請求的發(fā)送者和接收者之間的耦合。命令(Command)將一個請求命令封閉優(yōu)一個對象,便于將不同的請求參數(shù)化;對請求排對或記錄請求日志,以及支持可撤消請求的操作。解釋器

(Interpreter)給定一種語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示解釋語言中的句子。迭代器(Iterator)提供一種順序訪問一個聚合對象中各元素又不暴露對象內(nèi)部表示的方法。中介者

(Mediator)定義一個中介對象封裝一系列對象的交互。備忘錄

(Memento)在不破壞封裝的條件下,獲得一個對象的內(nèi)部狀態(tài)并將它外部化,從而在以后可使對象恢復(fù)到這個狀態(tài)。觀察者

(Observer)定義對象一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象均得到通知并被自動更新。狀態(tài)

(State)允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎能修改它的類。策略

(Strategy)定義一系列算法,把它們均封閉起來,并且使它們可相互替換。它使算法可獨立于使用者而變化。模板方法

(TemplateMethod)定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,從而使子類可以不改變算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。訪問者

(Visitor)描述一個作用于某對象結(jié)構(gòu)中各元素的操作,從而可以在不改變被操作元素類的條件下定義新的操作。類別設(shè)計模式名稱意圖簡要說明10.7.2創(chuàng)建型模式

創(chuàng)建型模式幫助系統(tǒng)獨立于對象的產(chǎn)生、組合和表示。作用:一方面均將關(guān)于系統(tǒng)使用哪些具體的類的信息封裝起來;另一方面隱蔽了這些具體類的實例是如何被創(chuàng)建和放在一起的。因此,創(chuàng)建型模式在“什么”被創(chuàng)建、“怎樣”被創(chuàng)建、“誰”創(chuàng)建它以及“何時”創(chuàng)建等方面帶來了很大的靈活性,有利于設(shè)計可復(fù)用的軟件成分。

工廠方法模式(結(jié)構(gòu))

《interface》Creator《interface》ProductConcreteProductfactoryMethod()ConcreteCreatorfactoryMethod()《creates》Client產(chǎn)品/具體產(chǎn)品類

Product定義工廠方法生成的對象的接口。例如:(Java程序)publicinterfaceProduct{//產(chǎn)品的接口聲明}ConcreteProduct實現(xiàn)Product類的接口。例如:publicclassConcreteProductimplementsProduct{//構(gòu)造函數(shù)publicConcreteProduct(){//dosomething}//產(chǎn)品接口實現(xiàn)}創(chuàng)建者/具體創(chuàng)建者類Creator聲明一個工廠,返回一個Product類型的對象。也可定義工廠方法的缺省實現(xiàn)??烧{(diào)用工廠方法生成一個Product對象。例如:publicinterfaceCreator{//工廠方法接口聲明

publicProductfactoryMethod();}ConcreteCreator重定義工廠方法以返回適當?shù)腃oncreteProduct實例。例如:publicclassConcreteCreatorimplementsCreator{//工廠方法實現(xiàn)

publicProductfactoryMethod(){returnnewConcreteProduct();}}

客戶類Client僅使用由Creator和Product聲明的接口。例如:publicclassClient{privatestaticCreatorcreator;privatestaticProductproduct;publicstaticvoidmain(String[]args){creator=newConcreteCreator();product=creator.factoryMethod();//dootherthings}}使用條件一個類不知道它所必須創(chuàng)建的對象的類。一個類希望由其子類確定它創(chuàng)建的對象。類將創(chuàng)建對象的職責委派給多個幫助者子類中的一個,且希望將哪一個幫助者子類是代表者這一信息局部化。

依賴倒置原則使用效果

比直接產(chǎn)生對象更靈活?!肮S方法”給子類一個掛鉤,以便在子類中擴展。連接平行類層次。當一個類將它的一些職責委托給一個獨立的類的時候,就會產(chǎn)生平行類層次。

《interface》FigurecreateManipulator()《interface》ManipulatordownClick()upClick()drag()LineManipulatordownClick()upClick()drag()TextManipulatordownClick()upClick()drag()TextFigurecreateManipulator()LineFigurecreateManipulator()Client結(jié)論工廠方法模式在遵循依賴倒置原則方面有重要意義,使得高層策略模塊在創(chuàng)建類的實例時無需依賴具體的類。也使得一組類的完全不同序列的實現(xiàn)間進行交換成為可能。工廠方法模式會帶來復(fù)雜性。抽象工廠模式結(jié)構(gòu)《interface》AbstractFactorycreateProductA()createProductB()ConcreteFactory2createProductA()createProductB()ConcreteFactory1createProductA()createProductB()《interface》AbstractProductAConcreteProductA1ConcreteProductA2《interface》AbstractProductBConcreteProductB1ConcreteProductB2Client抽象工廠/具體工廠類AbstractFactory聲明創(chuàng)建抽象產(chǎn)品對象的操作接口。例如:publicinterfaceAbstractFactory{//產(chǎn)品等級結(jié)構(gòu)A的工廠方法

publicAbstractProductAcreateProductA();//產(chǎn)品等級結(jié)構(gòu)B的工廠方法

publicAbstractProductBcreateProductB();}ConcreteFactoryl實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作。例如:publicclassConcreteFactory1{//產(chǎn)品族1的具體工廠類

//產(chǎn)品等級結(jié)構(gòu)A的工廠方法

publicAbstractProductAcreateProductA(){returnnewConcreteProductA1();}//產(chǎn)品等級結(jié)構(gòu)B的工廠方法

publicAbstractProductBcreateProductB(){returnnewConcreteProductB1();}}//產(chǎn)品族2的具體工廠類的實現(xiàn)與產(chǎn)品族1的具體工廠類類似

抽象產(chǎn)品/具體產(chǎn)品類AbstractProductA聲明一種產(chǎn)品對象的接口。例如:publicinterfaceAbstractProductA{//接口聲明}//AbstractProductB與AbstractProductA類似

ConcreteProductA1定義將被相應(yīng)的具體工廠類創(chuàng)建的產(chǎn)品對象;實現(xiàn)抽象產(chǎn)品類接口。例如:publicclassConcreteProductA1implementsAbstractProductA{//構(gòu)造函數(shù)publicConcreteProductA1(){}//接口實現(xiàn)}//其它產(chǎn)品類的定義與ConcreteProductA1類似

客戶類Client僅使用由抽象工廠類和抽象產(chǎn)品類聲明的接口。例如:publicclassClient{privatestaticAbstractFactoryfactory1;privatestaticAbstractFactoryfactory2;privatestaticAbstractProductAproductA;privatestaticAbstractProductBproductB;publicstaticvoidmain(String[]args){factory1=newConcreteFactory1();factory2=newConcreteFactory2();productA=factory1.createProductA();productB=factory2.createProductB();//dootherthings}}

使用條件系統(tǒng)應(yīng)與如何創(chuàng)建、組合和表示其產(chǎn)品無關(guān)。系統(tǒng)應(yīng)由多個產(chǎn)品族之一來配置。強調(diào)一系列相關(guān)產(chǎn)品對象的設(shè)計以便聯(lián)合使用。提供一個產(chǎn)品類庫,但只想顯示它們的接口。

使用效果

隔離了具體的類。使產(chǎn)品族間的轉(zhuǎn)換容易進行。容易實現(xiàn)一個應(yīng)用一次只使用同一個系統(tǒng)中的產(chǎn)品對象。難以擴展“抽象工廠”以支持新種類的產(chǎn)品。

不符合開閉原則10.7.3結(jié)構(gòu)型模式

結(jié)構(gòu)型模式涉及如何組合類和對象構(gòu)成更大的結(jié)構(gòu)。一種方法是采用繼承機制來組合接口或?qū)崿F(xiàn)來形成更大的結(jié)構(gòu);另一種方法通過對象組合方式對一些對象進行組合來形成。由于對象組合可以在運行時刻改變,而繼承機制為靜態(tài)類組合,因而對象組合方式具有更大的靈活性。

適配器模式結(jié)構(gòu)ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用繼承機制ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用組合機制目標/被適配者類Target定義客戶類使用的與特定領(lǐng)域相關(guān)的接口。例如:publicinterfaceTarget{//定義用戶期望的接口

publicvoidrequest();}Adaptee定義一個被用來適配的已存在的接口。例如:publicclassAdaptee{//被適配的接口

publicvoidoperation(){//dosomething}}

適配器類(利用繼承機制)Adapter適配Adaptee類中的接口至Target類中的接口。例如://利用繼承機制publicclassAdapterextendsAdapteeimplementsTarget{//適配operation為requestpublicvoidrequest(){//調(diào)用operationoperation();}}適配器類(利用組合機制)//利用對象組合publicclassAdapterimplementsTarget{privateAdapteeadaptee;//構(gòu)造函數(shù)

publicAdapter(Adapteeadaptee){this.adaptee=adaptee;}//適配operation為requestpublicvoidrequest(){//dootherthingsadaptee.operation();//dootherthings}}

客戶類Client使用Target類中的接口。例如://利用繼承機制publicclassClient{privatestaticTargettarget;publicstaticvoidmain(String[]args){target=newAdapter();//以后可通過調(diào)用target.request()調(diào)用adaptee定義的operation()//dootherthings}}客戶類//利用對象組合publicclassClient{privatestaticTargettarget;privatestaticAdapteeadaptee;publicstaticvoidmain(String[]args){target=newAdapter(adaptee);//以后可通過調(diào)用target.request()調(diào)用adaptee定義的operation()//dootherthings}}

使用條件希望使用一個已存在的類,它的接口卻與希望的接口不匹配。要創(chuàng)建一個可復(fù)用的類,該類可以與其它不相關(guān)的類或不可預(yù)見的類協(xié)同工作。想使用一些已存在的類,但不能對每一個類子類化以匹配它們的接口(僅適用于對象組合的適配器模式)。

使用效果a、對利用繼承機制的情況:當想要匹配Adaptee類及其所有子類時,Adapter類將不能勝任。Adapter類可以重定義Adaptee類的行為。不需要間接指針以得到adaptee對象。b、對利用對象組合的情況:允許一個Adapter類與多個Adaptee類一起工作。重定義Adaptee類的行為比較困難。

組合模式(結(jié)構(gòu))

Client《interface》Componentoperation()add(Component)Remove(Component)getChild(int)Leafoperation()Compositeoperation()add(Component)Remove(Component)getChild(int)children部件類Component為組合中的對象聲明接口;在適當?shù)那闆r下實現(xiàn)所有類共有接口的缺省行為;聲明接口用于訪問和管理組合對象中的子部件。例如:publicinterfaceComponent{//operationpublicStringtoString();//聲明接口publicvoidadd(Componentcomponent);publicvoidremove(Componentcomponent);publicComponentgetChild(intindex);}

葉子類Leaf代表部件中的葉子對象,它沒有子部件;定義組合對象中原始對象的行為;對與子部件有關(guān)的操作接口實現(xiàn)為空。例如:publicclassLeafimplementsComponent{protectedintid=0;//標識號

publicLeaf(intid){this.id=id;}publicStringtoString(){return(“IamLeaf(ID“+id+“)”);}publicvoidadd(Componentcomponent){}publicvoidremove(Componentcomponent){}publicComponentgetChild(intindex){returnnull;}}

組合類Composite定義有子部件的部件的行為;存儲子部件;實現(xiàn)Component類接口中與子部件有關(guān)的操作。例如:importjava.util.LinkedList;publicclassCompositeimplementsComponent{protectedLinkedListchildren=newLinkedList();protectedintid=0;//標識號

publicComposite(intid){this.id=id;}publicStringtoString(){return(“IamComposite(ID”+id+“)”);}publicvoidadd(Componentcomponent){this.children.add(component);}publicvoidremove(Componentcomponent){this.children.remove(component);}publicComponentgetChild(intindex){return(Component)children.get(index);}}

客戶類Client通過部件類接口操作組合中的對象。例如:publicclassClient{publicstaticvoidmain(String[]args){Componentcomposite1=newComposite(1);Componentcomposite2=newComposite(2);Componentleaf1=newLeaf(1);Componentleaf2=newLeaf(2);Componentleaf3=newLeaf(3);composite1.add(leaf1);composite1.add(composite2);composite2.add(leaf2);composite1.add(leaf3);//dootherthings}}

使用條件

希望表示對象的整體/部分層次結(jié)構(gòu)。希望一致地處理葉子對象和組合對象。使用效果

定義了對象的整體/部分層次結(jié)構(gòu),且客戶代碼中任何用到葉子對象的地方均可使用組合對象。簡化了客戶代碼,客戶代碼不必關(guān)心處理的是一個葉子對象還是組合對象,即可以一致地使用葉子對象和組合對象。易于添加新的Composite和Leaf子類,客戶代碼不必因新的Composite和Leaf子類而改變。使設(shè)計更加通用,但難于限制只組合某些特定的部件。

10.7.4行為型模式

行為型模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻劃了在運行時難以跟蹤的復(fù)雜的控制流。行為型模式使設(shè)計者的注意力從控制流轉(zhuǎn)移到對象間的聯(lián)系方式上。

迭代器模式結(jié)構(gòu)

{abstract}AggregateCreateIterator()ConcreteAggregateCreateIterator()《interface》Iteratorfirst()next()isDone()currentItem()ConcreteIteratorfirst()next()isDone()currentItem()Client迭代器類Iterator定義訪問和遍歷聚合(aggregate)對象的接口。例如:publicinterfaceIterator{publicvoidfirst();publicvoidnext();publicbooleanisDone();publicObjectcurrentItem();}

具體迭代器類ConcreteIterator實現(xiàn)Iterator類中的接口;在聚合對象遍歷時跟蹤當前位置。例如:publicclassConcreteIteratorimplementsIterator{privateConcreteAggregateconAgg;privateintindex=0;privateintsize=0;//構(gòu)造函數(shù)

publicConcreteIterator(ConcreteAggregateconAgg){this.conAgg=conAgg;size=conAgg.size();index=0;}publicvoidfirst(){index=0;}publicvoidnext(){if(index<size){index++;}}publicbooleanisDone(){return(index>=size);}publicObjectcurrentItem(){returnconAgg.getItem(index);}}

聚合/具體聚合類Aggregate定義創(chuàng)建相應(yīng)迭代器對象的接口。例如:abstractpublicclassAggregate{publicIteratorcreateIterator(){returnnull;}}

ConcreteAggregate實現(xiàn)Aggregate類中的接口,返回ConcreteIterator類的一個適當?shù)膶嵗?。例如:publicclassConcreteAggregateextendsAggregate{privateObject[]objects={“Dog”,“Pig”,“Horse”,“Monkey”,“Mouse”};publicIteratorcreateIterator(){returnnewConcreteIterator(this);}publicObjectgetItem(intindex){if(index<objects.length){returnobj

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論