版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章軟件復(fù)用技術(shù)軟件復(fù)用軟件復(fù)用早在20世紀(jì)50年代用機(jī)器語言編寫程序時(shí)就開始運(yùn)用。作用:軟件復(fù)用通過充分利用已有開發(fā)成果,消除包括分析、設(shè)計(jì)、編碼、測試等在內(nèi)的許多重復(fù)勞動(dòng),極大地提高了軟件開發(fā)的效率。同時(shí),通過復(fù)用高質(zhì)量的已有開發(fā)成果,避免了重新開發(fā)可能引入的錯(cuò)誤,由此也保證了軟件的高質(zhì)量。
10.1軟件復(fù)用概述
所謂軟件復(fù)用是指利用已有的、對(duì)建立新系統(tǒng)有用的軟件制品來形成新系統(tǒng)的活動(dòng)。目前,人們對(duì)軟件復(fù)用寄予厚望,認(rèn)為其有可能成為突破軟件危機(jī)的一條出路。
10.1.1軟件復(fù)用目的
1、縮短軟件開發(fā)和維護(hù)的時(shí)間;2、降低軟件開發(fā)和維護(hù)的成本;3、保證軟件的可靠性;4、保證軟件的一致性;5、保護(hù)投資者的利益;…
10.1.2軟件復(fù)用的類型
軟件復(fù)用可以分為橫向復(fù)用和縱向復(fù)用兩種類型。橫向復(fù)用是指復(fù)用不同應(yīng)用領(lǐng)域中的軟件成份,如數(shù)據(jù)結(jié)構(gòu)、算法、人機(jī)界面構(gòu)件等。面向?qū)ο笤O(shè)計(jì)模式是一種典型的橫向復(fù)用機(jī)制??v向復(fù)用是指在一類具有較多共性的應(yīng)用領(lǐng)域之間復(fù)用軟件成份??v向復(fù)用活動(dòng)的關(guān)鍵在于領(lǐng)域分析:根據(jù)應(yīng)用領(lǐng)域的特征和相似性,預(yù)測軟件成份的可復(fù)用性。一旦確認(rèn)了軟件成份的可復(fù)用價(jià)值,便進(jìn)行開發(fā),然后將開發(fā)得到的軟件制品存入可復(fù)用構(gòu)件庫,供未來開發(fā)項(xiàng)目使用。
10.1.3軟件復(fù)用的內(nèi)容
軟件復(fù)用的內(nèi)容,除了源程序代碼外,還有許多其它軟件制品,甚至特定的分析建模方法、檢查技術(shù)、質(zhì)量保證過程等,均可以被復(fù)用。C.Jones定義了10種可能復(fù)用的軟件制品:項(xiàng)目計(jì)劃、成本估計(jì)、體系結(jié)構(gòu)、需求模型和規(guī)格說明、設(shè)計(jì)、源代碼、用戶文檔和技術(shù)文檔、用戶界面、數(shù)據(jù)、測試用例。10.1.4針對(duì)復(fù)用的過程模型
領(lǐng)域分析領(lǐng)域設(shè)計(jì)(軟件體系結(jié)構(gòu)開發(fā))領(lǐng)域?qū)崿F(xiàn)(可復(fù)用軟件制品開發(fā))領(lǐng)域模型領(lǐng)域構(gòu)架可復(fù)用軟件制品庫領(lǐng)域知識(shí)領(lǐng)域工程系統(tǒng)分析規(guī)約&設(shè)計(jì)建造系統(tǒng)規(guī)約分析&設(shè)計(jì)模型應(yīng)用軟件用戶需求應(yīng)用工程10.1.5軟件復(fù)用成功實(shí)施的關(guān)鍵
管理者的支持;(復(fù)用影響了企業(yè)的組織結(jié)構(gòu)、文化和軟件技術(shù)等)復(fù)用支持組的建立;(承擔(dān)可復(fù)用軟件制品的建立、獲取、驗(yàn)證、分類和管理)復(fù)用庫的創(chuàng)建;(復(fù)用庫用來對(duì)可復(fù)用軟件制品進(jìn)行分類、組織、存儲(chǔ)和管理)復(fù)用驅(qū)動(dòng)的方法支持。(一方面指導(dǎo)可復(fù)用制品的建立人員識(shí)別復(fù)用機(jī)會(huì)和侯選的可復(fù)用制品,并建立一個(gè)可復(fù)用制品,另一方面指導(dǎo)應(yīng)用軟件開發(fā)人員尋找可復(fù)用制品,并利用它們組裝成新的應(yīng)用。)10.1.6復(fù)用成熟度模型(IBM)成熟度等級(jí)復(fù)用比例過程復(fù)用制品范圍工具初始級(jí)沒有復(fù)用-20%至20%特定的過程子程序宏個(gè)人沒有庫監(jiān)控級(jí)原始的復(fù)用10%至50%項(xiàng)目級(jí)的過程模塊包小組非正式的數(shù)據(jù)庫協(xié)調(diào)級(jí)計(jì)劃的復(fù)用30%至40%標(biāo)準(zhǔn)的過程子系統(tǒng)模型框架部門有配置管理功能的數(shù)據(jù)庫計(jì)劃級(jí)正式的復(fù)用50%至70%大規(guī)模的復(fù)用應(yīng)用程序生成器現(xiàn)場復(fù)用庫牢固級(jí)領(lǐng)域分析80%至90%軟件組裝過程特定領(lǐng)域體系結(jié)構(gòu)公司一組特定領(lǐng)域復(fù)用庫的集合10.1.7針對(duì)復(fù)用的軟件項(xiàng)目組織
高層經(jīng)理支持者創(chuàng)建者復(fù)用者庫管理工具可復(fù)用制品庫存取分類、存儲(chǔ)檢索復(fù)用復(fù)用檢索規(guī)格可復(fù)用制品獎(jiǎng)罰獎(jiǎng)罰獎(jiǎng)罰報(bào)告報(bào)告報(bào)告職責(zé)創(chuàng)建者負(fù)責(zé)從復(fù)用者手中接受可復(fù)用制品的設(shè)計(jì)規(guī)格說明,進(jìn)行可復(fù)用制品的設(shè)計(jì)、實(shí)現(xiàn)和質(zhì)量控制,重點(diǎn)考慮可復(fù)用制品的可復(fù)用性。
復(fù)用者負(fù)責(zé)軟件系統(tǒng)開發(fā)任務(wù)。
復(fù)用支持者負(fù)責(zé)可復(fù)用制品的資格確認(rèn)、質(zhì)量保證、分類和存儲(chǔ)。
高層經(jīng)理負(fù)責(zé)管理、組織和協(xié)調(diào)各類軟件復(fù)用活動(dòng),并處理所有與復(fù)用有關(guān)的事務(wù)性工作。
10.2領(lǐng)域工程
所謂領(lǐng)域是指一組具有相似或相近軟件需求的應(yīng)用系統(tǒng)所覆蓋的功能區(qū)域。領(lǐng)域工程則是為領(lǐng)域中的應(yīng)用工程建立基本能力和必備基礎(chǔ)的過程,它覆蓋了建立可復(fù)用軟件制品的所有活動(dòng)。作用:領(lǐng)域工程有助于產(chǎn)生具有較高可復(fù)用性的軟件制品。同時(shí),領(lǐng)域工程產(chǎn)生的領(lǐng)域模型和領(lǐng)域構(gòu)架有助于針對(duì)復(fù)用的開發(fā)。
10.2.1領(lǐng)域工程與應(yīng)用工程的關(guān)系
在單個(gè)應(yīng)用系統(tǒng)工程(簡稱應(yīng)用工程)的開發(fā)過程中,軟件開發(fā)人員的任務(wù)是在特定的條件下,針對(duì)一組特定的需求產(chǎn)生一組特定的設(shè)計(jì)和實(shí)現(xiàn)。領(lǐng)域工程對(duì)領(lǐng)域中的應(yīng)用系統(tǒng)進(jìn)行分析,識(shí)別這些應(yīng)用系統(tǒng)的共同特征和可變特征,對(duì)刻畫這些特征的對(duì)象和操作進(jìn)行選擇和抽象,形成領(lǐng)域模型,依據(jù)領(lǐng)域模型產(chǎn)生出領(lǐng)域中應(yīng)用系統(tǒng)共同具有的體系結(jié)構(gòu)DSSA或生成過程。并以此為基礎(chǔ)識(shí)別、開發(fā)和組織可復(fù)用制品。
領(lǐng)域工程和應(yīng)用工程是相互聯(lián)系的
一方面,領(lǐng)域工程的主要信息來源是通過應(yīng)用工程得到的現(xiàn)有系統(tǒng),包括需求規(guī)格說明、設(shè)計(jì)、實(shí)現(xiàn)等。另一方面,領(lǐng)域工程和應(yīng)用工程需要解決一些相類似的問題,如:如何獲取并表示用戶需求?如何設(shè)計(jì)并表示設(shè)計(jì)模型等。
領(lǐng)域工程要適用于一族系統(tǒng),而不只是一個(gè)系統(tǒng)。因此,領(lǐng)域工程比應(yīng)用工程要復(fù)雜,往往不能事先設(shè)計(jì)劃好,也很難實(shí)施管理。10.2.2領(lǐng)域工程過程
領(lǐng)域分析(目標(biāo)主要是獲得領(lǐng)域模型)領(lǐng)域設(shè)計(jì)(目標(biāo)是獲得領(lǐng)域構(gòu)架DSSA)領(lǐng)域?qū)崿F(xiàn)(主要目標(biāo)是定義將需求翻譯到由可復(fù)制品創(chuàng)建的系統(tǒng)的機(jī)制)領(lǐng)域工程是一個(gè)反復(fù)的、逐漸精化的過程,在實(shí)施過程中都可能返回到以前的步驟,對(duì)以前的步驟得到的結(jié)果進(jìn)行修改和完善后,再回到當(dāng)前步驟。
10.2.3領(lǐng)域工程參與人員
領(lǐng)域?qū)<?/p>
(任務(wù):提供關(guān)于領(lǐng)域中應(yīng)用系統(tǒng)的需求規(guī)約和實(shí)現(xiàn)的知識(shí),幫助組織規(guī)范的、一致的領(lǐng)域字典,幫助選擇樣本系統(tǒng)作為領(lǐng)域工程的依據(jù),復(fù)審領(lǐng)域模型、DSSA等領(lǐng)域工程產(chǎn)品,等等)領(lǐng)域分析員
(控制整個(gè)領(lǐng)域分析過程,進(jìn)行知識(shí)獲取,將獲取的知識(shí)組織到領(lǐng)域模型中,根據(jù)現(xiàn)有系統(tǒng)、標(biāo)準(zhǔn)規(guī)范等驗(yàn)證領(lǐng)域模型的準(zhǔn)確性和一致性,維護(hù)領(lǐng)域模型。)領(lǐng)域工程參與人員領(lǐng)域設(shè)計(jì)人員(控制整個(gè)領(lǐng)域設(shè)計(jì)過程,根據(jù)領(lǐng)域模型和現(xiàn)有的系統(tǒng)開發(fā)出DSSA,驗(yàn)證DSSA的準(zhǔn)確性和一致性,建立領(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ù)用制品,對(duì)可復(fù)用制品進(jìn)行驗(yàn)證,建立DSSA與可復(fù)用制品間的聯(lián)系。)10.2.4領(lǐng)域模型
領(lǐng)域模型描述了領(lǐng)域中一些基本的概念,如功能、特性、數(shù)據(jù)、對(duì)象類和需求,以及這些概念間的相互關(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)域的范圍。它也給出了接納或拒絕接納一個(gè)給定系統(tǒng)或功能的基本原理。
領(lǐng)域字典和概念模型領(lǐng)域字典:定義領(lǐng)域詞匯。
概念模型:以某種合適的方式,例如對(duì)象圖、類圖、交互圖、狀態(tài)轉(zhuǎn)換圖或?qū)嶓w關(guān)系圖或數(shù)據(jù)流圖等,和非正式文本來描述領(lǐng)域內(nèi)的概念。
特征模型
定義一組可重用的和可配置的需求,用于指定一個(gè)領(lǐng)域內(nèi)的系統(tǒng)。
特征和特征模型最初由FODA(FeatureOrientedDomainAnalysis,面向特征的領(lǐng)域分析)方法引入的。
在FODA中,特征是指系統(tǒng)的一個(gè)最終用戶可見的特性。例如,汽車的傳動(dòng)裝置是自動(dòng)的或手動(dòng)的。
特征模型由特征圖、特征定義、特征組合規(guī)則和特征原理(特征的選擇與不選擇原因)等組成。
例子(FODA)汽車傳動(dòng)裝置馬力空調(diào)手動(dòng)自動(dòng)二者選一必需的可選的組合規(guī)則:“空調(diào)”需要“馬力”大于105特征原理:“手動(dòng)”可以使燃燒效率更高10.2.5領(lǐng)域構(gòu)架
領(lǐng)域構(gòu)架是使用可復(fù)用制品來構(gòu)造領(lǐng)域中應(yīng)用系統(tǒng)的高層設(shè)計(jì)模型(軟件構(gòu)架)。
軟件構(gòu)架(softwarearchitecture):抽象地說,軟件構(gòu)架描述了構(gòu)建系統(tǒng)的元素、元素間的交互、指導(dǎo)元素組合的模式以及對(duì)這些模式的限制。管道/過濾器模式和層次體系結(jié)構(gòu)模式是兩種典型的軟件構(gòu)架模式。
管道/過濾器模式結(jié)構(gòu)每個(gè)構(gòu)件都有一組輸入和輸出,構(gòu)件讀輸入的數(shù)據(jù)流,經(jīng)過內(nèi)部處理,然后產(chǎn)生輸出數(shù)據(jù)流。
入庫請(qǐng)求商品檢驗(yàn)入庫清點(diǎn)商品入庫檢驗(yàn)單入庫單已入貨庫存單過濾器管道管道/過濾器模式特點(diǎn)使得軟構(gòu)件具有良好的隱蔽性和高內(nèi)聚、低耦合的特點(diǎn);支持軟件重用只要提供適合在兩個(gè)過濾器之間傳送的數(shù)據(jù),任何兩個(gè)過濾器都可被連接起來;允許設(shè)計(jì)者將整個(gè)系統(tǒng)的輸入/輸出行為看成是多個(gè)過濾器的行為的簡單合成;系統(tǒng)維護(hù)和增強(qiáng)系統(tǒng)性能簡單新的過濾器可以添加到現(xiàn)有系統(tǒng)中來;舊的可以被改進(jìn)的過濾器替換掉;允許對(duì)一些如吞吐量、死鎖等屬性進(jìn)行分析;支持并行執(zhí)行每個(gè)過濾器是作為一個(gè)單獨(dú)的任務(wù)完成,因此可與其它任務(wù)并行執(zhí)行。
管道/過濾器模式不足不適合處理交互的應(yīng)用。當(dāng)需要增量地顯示改變時(shí),這個(gè)問題尤為嚴(yán)重。易導(dǎo)致進(jìn)程成為批處理的結(jié)構(gòu)。這是因?yàn)殡m然過濾器可增量式地處理數(shù)據(jù),但它們是獨(dú)立的,所以設(shè)計(jì)者必須將每個(gè)過濾器看成一個(gè)完整的從輸入到輸出的轉(zhuǎn)換。因?yàn)樵跀?shù)據(jù)傳輸上沒有通用的標(biāo)準(zhǔn),每個(gè)過濾器都增加了解析和合成數(shù)據(jù)的工作,這樣就導(dǎo)致了系統(tǒng)性能下降,并增加了編寫過濾器的復(fù)雜性。
層次體系結(jié)構(gòu)模式結(jié)構(gòu)
每一層為上層服務(wù),并作為下層客戶;內(nèi)部的層只對(duì)相鄰的層可見;連接件通過決定層間如何交互的協(xié)議來定義。驗(yàn)證密鑰管理
文件接口密碼層用戶最內(nèi)層是密碼層,包括加密和解密的功能,用于系統(tǒng)最基本的加密策略。第二層是文件級(jí)的接口,即加密和解密一個(gè)文件。第三層是密鑰管理,它允許一個(gè)組件在一份文件上簽名,證實(shí)簽名后,計(jì)算出一個(gè)散列碼作為訪問這個(gè)文件的權(quán)限限制。最后,第四層提供驗(yàn)證,這一層管理一個(gè)密碼文件,這個(gè)文件以加密形式存儲(chǔ),并且要求用戶輸入身份驗(yàn)證(比如用戶名)和密碼。
客戶機(jī)/服務(wù)器體系結(jié)構(gòu)(2層)
數(shù)據(jù)存儲(chǔ)在集中式管理的服務(wù)器中,客戶機(jī)則負(fù)責(zé)數(shù)據(jù)處理和用戶界面的表示。由客戶提出一個(gè)服務(wù)的請(qǐng)求,然后由服務(wù)器響應(yīng)這個(gè)請(qǐng)求。
不足:復(fù)用受限于特定的數(shù)據(jù)庫格式;數(shù)據(jù)處理邏輯改變困難;…。用戶界面數(shù)據(jù)存儲(chǔ)數(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ù)存儲(chǔ)的信息。
用戶接口用戶服務(wù)數(shù)據(jù)存取服務(wù)數(shù)據(jù)存儲(chǔ)數(shù)據(jù)層業(yè)務(wù)邏輯層用戶層業(yè)務(wù)服務(wù)層次體系結(jié)構(gòu)模式的特點(diǎn)支持基于抽象程度遞增的系統(tǒng)設(shè)計(jì),使設(shè)計(jì)者可以把一個(gè)復(fù)雜系統(tǒng)按遞增的步驟進(jìn)行分解;依賴性局部化,因?yàn)槊恳粚又炼嗪拖噜彽纳舷聦咏换?,因此功能的改變最多影響相鄰的上下層;支持重用只要提供的服?wù)接口定義不變,同一層的不同實(shí)現(xiàn)可以交換使用,這樣,就可以定義一組標(biāo)準(zhǔn)的接口,而允許各種不同的實(shí)現(xiàn)方法。
層次體系結(jié)構(gòu)模式的不足并不是每個(gè)系統(tǒng)都可以很容易地劃分為分層的模式,甚至即使一個(gè)系統(tǒng)的邏輯結(jié)構(gòu)是層次化的,出于對(duì)系統(tǒng)性能的考慮,系統(tǒng)設(shè)計(jì)人員不得不把一些低級(jí)或高級(jí)的功能綜合起來;很難找到一個(gè)合適的、正確的層次抽象方法;當(dāng)某個(gè)層次的構(gòu)成和行為發(fā)生變化時(shí)會(huì)產(chǎn)生連鎖反應(yīng)。
FODA方法領(lǐng)域分析由卡內(nèi)基·梅隆大學(xué)的軟件工程研究所提出的領(lǐng)域工程方法。它支持對(duì)某領(lǐng)域中系統(tǒng)共性和個(gè)性的發(fā)現(xiàn)、分析和文檔記錄。步驟:上下文分析;領(lǐng)域建模;構(gòu)架建模。上下文分析
上下文分析的目標(biāo)是定義領(lǐng)域的范圍。在這個(gè)步驟中要分析領(lǐng)域與外部元素間的關(guān)系,例如不同的操作環(huán)境,不同的數(shù)據(jù)需求等。還要對(duì)可變性進(jìn)行評(píng)價(jià)。上下文分析的結(jié)果是上下文模型。
屏幕管理系統(tǒng)上下文模型領(lǐng)域建模
根據(jù)領(lǐng)域范圍,分析領(lǐng)域中應(yīng)用系統(tǒng)的共性和差異,并建立領(lǐng)域模型,主要包括以下三種活動(dòng):特征分析:獲得客戶或最終用戶對(duì)一類系統(tǒng)的一般能力的理解,即特征。信息分析:定義和分析為實(shí)現(xiàn)領(lǐng)域中應(yīng)用所需的領(lǐng)域知識(shí)和數(shù)據(jù)需求。
操作分析:識(shí)別領(lǐng)域中應(yīng)用的行為特征。例子:屏幕管理系統(tǒng)特征圖之一例子:屏幕管理系統(tǒng)信息模型
操作分析選擇特征的處理方法1:每個(gè)特征分開方法2:采用參數(shù)分開方法3:采用繼承分開構(gòu)架建模
構(gòu)架建模為領(lǐng)域中的應(yīng)用提供軟件解決方案,其焦點(diǎn)是識(shí)別并發(fā)進(jìn)程和面向領(lǐng)域的共同模塊。
屏幕管理系統(tǒng)體系結(jié)構(gòu)FODA活動(dòng)與產(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)域分析對(duì)一組系統(tǒng)制作可復(fù)用、可定制的需求系統(tǒng)設(shè)計(jì)為特定系統(tǒng)進(jìn)行設(shè)計(jì)領(lǐng)域設(shè)計(jì)制作用于一組系統(tǒng)的可復(fù)用的設(shè)計(jì)系統(tǒng)實(shí)現(xiàn)得到一個(gè)系統(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)件,是指語義完整、語法正確和有可重用價(jià)值的單位軟件,它是語義描述、通信接口和實(shí)現(xiàn)代碼的復(fù)合體。簡單地說,組件是具有一定的功能,能夠獨(dú)立工作或能同其它組件裝配起來協(xié)調(diào)工作的程序體,其使用同它的開發(fā)、生產(chǎn)無關(guān)。組件可分為源代碼組件和二進(jìn)制代碼組件。
可復(fù)用組件應(yīng)具備的屬性
①有用性——組件必須提供有用的功能;②可用性——組件必須易于理解和使用;③質(zhì)量——組件及其變形必須能正確工作;④適應(yīng)性——組件應(yīng)該易于通過參數(shù)化等方式在不同語境中進(jìn)行配置;⑤可移植性——組件應(yīng)能在不同的硬件運(yùn)行平臺(tái)和軟件環(huán)境中工作。
組件復(fù)用方式組件復(fù)用有白盒和黑盒兩種方式。黑盒是指不作修改的直接引用;白盒指進(jìn)行適應(yīng)性修改的引用。源代碼在大多數(shù)情況下是指適應(yīng)性修改地引用;二進(jìn)制代碼組件的復(fù)用只能采用黑盒方式,通常只能了解組件的接口和屬性等信息。
10.3.2組件模型
組件模型通常由基于各種語言開發(fā)工具、組件嵌入機(jī)制和相關(guān)服務(wù)(事務(wù)、安全、認(rèn)證、負(fù)載均衡等)組成。
比較成熟的組件模型有OMG的CORBA、SUN的EJB(JavaBean)和Microsoft的COM/DCOM/COM+。
三種組件模型間的差別
COM為組件交互定義了一個(gè)二進(jìn)制的標(biāo)準(zhǔn),只是Windows平臺(tái)上廣泛采用的模型。CORBA可以運(yùn)行在多種不同操作系統(tǒng)上,與平臺(tái)和語言無關(guān),但它不是一個(gè)二進(jìn)制的標(biāo)準(zhǔn)。EJB(EnterpriseJavaBeans)是一個(gè)服務(wù)器端組件模型,JavaBeams是一個(gè)可供使用的組件,主要用于構(gòu)建客戶端軟件并特別考慮了GUI組件的需要。EJB和CORBA兼容,并可能相互促進(jìn)。由于EJB要求所有組件都要用Java編寫,而Java必須運(yùn)行在Java虛擬機(jī)上,從而會(huì)導(dǎo)致Java很難與非Java代碼實(shí)現(xiàn)緊密集成。
10.3.3組件獲取與描述
通??梢圆捎靡韵峦緩絹慝@取組件:從現(xiàn)存組件中獲取得符合要求的組件,直接使用或作適應(yīng)性修改,得到可復(fù)用的組件;通過遺產(chǎn)工程,將具有潛在復(fù)用價(jià)值的組件提取出來,得到可復(fù)用的組件;從市場上購買現(xiàn)成的商業(yè)組件,即COTS(CommercialOff-The-Shelf,商業(yè)現(xiàn)貨)組件;開發(fā)新的符合要求的組件。
組件獲取后,可對(duì)它進(jìn)行結(jié)構(gòu)化組織并放入可復(fù)用組件庫,以備復(fù)用。組件描述
屬性。描述了組件的特征。屬性值對(duì)外可以讀出,也可以修改。功能接口。即組件向外提供的服務(wù)。依賴關(guān)系。指出組件在實(shí)例化時(shí)所依賴的其它組件的特定接口,是組件完成其任務(wù)所必需的。
10.3.4組件分類
關(guān)鍵詞分類用戶界面窗口菜單對(duì)話框事件處理圖形窗口文本窗口信息對(duì)話框數(shù)據(jù)錄入對(duì)話框拖放處理鍵盤事件處理多面分類方式
10.3.5組件檢索
基于關(guān)鍵詞的檢索(在圖形用戶界面上將可復(fù)用組件庫的關(guān)鍵詞樹直觀地顯示給用戶,用戶通過逐級(jí)瀏覽關(guān)鍵詞樹尋找需要的關(guān)鍵詞并提取相應(yīng)的組件;或直接輸入含通配符的關(guān)鍵詞由系統(tǒng)自動(dòng)給出合適的候選組件清單,用戶選擇并提取相應(yīng)的組件。);多面檢索(構(gòu)造查詢、檢索組件、排序組件)。上述兩種檢索方法均基于語法匹配,這要求使用者對(duì)組件庫中的有關(guān)詞匯有較全面的把握和較精確的理解。理想的檢索方法是語義匹配:組件庫的用戶以形式化的手段描述所需組件的功能或行為的語義,系統(tǒng)通過定理證明或基于知識(shí)的推理來尋找語義上等價(jià)的或相近的組件。
10.3.6組件使用
理解組件(①組件的功能與行為;②相關(guān)的領(lǐng)域知識(shí);③可適應(yīng)性約束條件與例外情形;④可以預(yù)見的修改部分及修改方法);修改組件;合成組件(基于功能的合成技術(shù):調(diào)用與參數(shù)傳遞、基于數(shù)據(jù)的合成技術(shù):調(diào)用與參數(shù)傳遞、面向?qū)ο蟮暮铣杉夹g(shù):繼承)。10.4公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)
公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)(CommonObjectRequestBrokerArchitecture,CORBA)是由對(duì)象管理組織OMG制定的一個(gè)工業(yè)規(guī)范,其主要目標(biāo)是提供一種機(jī)制,在此基礎(chǔ)上,對(duì)象可以透明地請(qǐng)求和獲得應(yīng)答。CORBA的實(shí)質(zhì)是遠(yuǎn)過程調(diào)用與面向?qū)ο蠹夹g(shù)的有機(jī)結(jié)合。
OMG于1990年制訂了OMA(ObjectManagementArchitecture),它可用任何方法來實(shí)現(xiàn),CORBA是其中的一種實(shí)現(xiàn)方案。
OMA(層次結(jié)構(gòu))OSORBServicesFacilitiesDomainObjectsObjectsObjectsObjectsObjects10.4.1CORBA的組成
客戶程序(Client)對(duì)象實(shí)現(xiàn)(Server)動(dòng)態(tài)調(diào)用接口靜態(tài)IDL存根ORB接口動(dòng)態(tài)骨架接口靜態(tài)IDL骨架對(duì)象適配器ORB核GIOP/IIOP接口存儲(chǔ)數(shù)據(jù)庫實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)庫ORB核/ORB接口
ORB(ObjectRequestBroker)該是作為對(duì)象互通信的軟總線。ORB截獲服務(wù)請(qǐng)求調(diào)用,然后識(shí)別網(wǎng)絡(luò)中服務(wù)器的位置,即對(duì)象實(shí)現(xiàn)的位置。若服務(wù)器不在運(yùn)行,則ORB啟動(dòng)服務(wù)器,并一直等待到它準(zhǔn)備接受服務(wù)請(qǐng)求為止。
ORB接口是ORB核給出的接口,同時(shí)為客戶和對(duì)象實(shí)現(xiàn)方所見,提供了一些只能由ORB核提供的服務(wù):對(duì)象引用操作、ORB初始化、對(duì)象適配器初始化和獲取初始對(duì)象引用。
ORB之間的互操作則采用GIOP和IIOP實(shí)現(xiàn)。
ORB的特性可使客戶程序不用考慮:服務(wù)器編程語言、服務(wù)器平臺(tái)、服務(wù)器地點(diǎn)和網(wǎng)絡(luò)協(xié)議。
ORB提供了兩個(gè)用于存儲(chǔ)有關(guān)對(duì)象信息的服務(wù):接口倉庫(接口存儲(chǔ)數(shù)據(jù)庫)和實(shí)現(xiàn)倉庫(實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)庫)。
IDLIDL(InterfaceDefinitionLanguage)是用于說明對(duì)象接口的標(biāo)識(shí)語言。作用:接口概念一方面把對(duì)象的使用與對(duì)象的實(shí)現(xiàn)徹底分開;另一方面ORB使用對(duì)象的接口描述可在異類環(huán)境下實(shí)現(xiàn)不同數(shù)據(jù)格式的轉(zhuǎn)換;第三,IDL編譯程序能把接口描述直接映射到目標(biāo)語言,極大地加快了代碼開發(fā)。
例子
ModuleShapes{interfaceRectangle{attributeIntegerlength;attributeintegerwidth;integerarea();voiddraw();
voidtranslate(inintegerX,inintegerY);}interfaceSquareRectangle{}}
module用來引入一層作用域;Interface集中一些相關(guān)的操作;attribute標(biāo)識(shí)了具有g(shù)et/set存取器函數(shù)對(duì)的數(shù)據(jù)成員;in表輸入;out表輸出;inout表輸入輸出。
IDL編譯由IDL編譯器根據(jù)IDL代碼生成相應(yīng)編程語言的客戶代理(骨架)和服務(wù)器代理(存根)對(duì)象等。
靜態(tài)調(diào)用
靜態(tài)調(diào)用是指通過靜態(tài)IDL存根和靜態(tài)IDL骨架進(jìn)行的調(diào)用過程。靜態(tài)IDL存根對(duì)客戶端來說可看作它的遠(yuǎn)端對(duì)象,即服務(wù)器代理;靜態(tài)IDL骨架對(duì)對(duì)象實(shí)現(xiàn)來說可看作它的客戶端,即客戶代理。靜態(tài)調(diào)用必須在編譯時(shí)就知道特定的目標(biāo)對(duì)象的接口信息。靜態(tài)IDL存根和靜態(tài)IDL骨架由編譯IDL接口定義語言文件得到。
客戶端ORB請(qǐng)求靜態(tài)IDL存根打包請(qǐng)求(源編程語言格式樣→傳輸格式)ORB傳遞且激合對(duì)象實(shí)現(xiàn)靜態(tài)IDL骨架解包(傳輸格式→目的編程語言格式)對(duì)象實(shí)現(xiàn)動(dòng)態(tài)調(diào)用
動(dòng)態(tài)調(diào)用接口(DynamicInvocationInterface,DII)和動(dòng)態(tài)骨架接口(DynamicSkeletonInterface,DSI)可分別被視為通用存根和通用骨架,它們由ORB直接提供不依賴于所調(diào)用對(duì)象的接口。
客戶端運(yùn)期間發(fā)請(qǐng)求DII根據(jù)接口庫提供的IDL接口信息通過函數(shù)Create-request動(dòng)態(tài)創(chuàng)建對(duì)象請(qǐng)求ORB傳遞DSI從進(jìn)入的消息中找出調(diào)用的目標(biāo)對(duì)象及相應(yīng)的方法,并提供運(yùn)行時(shí)的連接機(jī)制對(duì)象實(shí)現(xiàn)對(duì)象適配器
對(duì)象適配器是ORB與對(duì)象實(shí)現(xiàn)間的接口,其主要的工作如下:
對(duì)象實(shí)現(xiàn)的注冊(cè);生成及管理對(duì)象引用;服務(wù)器進(jìn)程激活;對(duì)象激活/撤銷/向上調(diào)用。10.4.2ORB運(yùn)行機(jī)制
1.開始;2.客戶獲取特定對(duì)象實(shí)現(xiàn)的對(duì)象引用;3.如果對(duì)象以靜態(tài)方式實(shí)現(xiàn),則通過IDL存根向?qū)ο髮?shí)現(xiàn)發(fā)出請(qǐng)求,然后轉(zhuǎn)6;4.將請(qǐng)求發(fā)給ORB提供的DII;5.DII根據(jù)接口庫的信息將請(qǐng)求傳遞給對(duì)象實(shí)現(xiàn);6.ORB傳遞請(qǐng)求;7.ORB內(nèi)核在請(qǐng)求到達(dá)后做一定的處理,然后將其送給對(duì)象實(shí)現(xiàn)登記的對(duì)象適配器;8.對(duì)象適配器接收請(qǐng)求;9.如果不是本ORB域登記,則轉(zhuǎn)13;10.如果有相應(yīng)的IDL骨架存在,則對(duì)象適配器通過IDL骨架調(diào)用對(duì)象實(shí)現(xiàn)中的方法,并轉(zhuǎn)17;11.對(duì)象適配器通過DSI調(diào)用對(duì)象實(shí)現(xiàn)方法;12.轉(zhuǎn)17;13.將請(qǐng)求傳給DSI;14.DSI產(chǎn)生一個(gè)代理對(duì)象;15.代理對(duì)象將請(qǐng)求轉(zhuǎn)成中間協(xié)議表示形式傳給目的ORB;16.目的ORB將中間協(xié)議表示形式轉(zhuǎn)換成本地DII請(qǐng)求,以實(shí)現(xiàn)對(duì)對(duì)象實(shí)現(xiàn)中的方法進(jìn)行調(diào)用;17.將結(jié)果按原路返回給客戶;
10.4.3基于CORBA的軟件開發(fā)
①編寫OMG定義的IDL接口規(guī)范說明文件,描述服務(wù)對(duì)象所支持的操作和類型;②編譯IDL規(guī)格說明文件,生成客戶端存根和服務(wù)器端骨架;③編寫對(duì)象實(shí)現(xiàn)程序;④編寫服務(wù)器和客戶主程序結(jié)構(gòu);⑤將對(duì)象實(shí)現(xiàn)程序,服務(wù)主程序和生成的服務(wù)器骨架編譯連接成服務(wù)端可執(zhí)行程序;⑥將客戶端主程序和生成的客戶端存根編譯連接成客戶端可執(zhí)行程序,且若服務(wù)器端是基于Web和瀏覽器方式的,則相應(yīng)地編寫HTML超文本文件,鏈入編寫的客戶方JavaApplet小程序;⑦分別運(yùn)行服務(wù)器端和客戶端程序。
10.4.4CORBA的特點(diǎn)
同時(shí)支持分布計(jì)算技術(shù)和面向?qū)ο蠹夹g(shù)。支持許多現(xiàn)存的語言并把這些語言混合到一個(gè)分布式應(yīng)用系統(tǒng)之中。
代理機(jī)制使得客戶端程序和服務(wù)器端程序完全分離,這樣服務(wù)器端和客戶端程序都可自由地修改而無需通知對(duì)方。
提供了“軟件總線”的功能,實(shí)現(xiàn)了軟件組件的即插即用。
提供了一種高度的互操作性,保證了建立在不同CORBA產(chǎn)品之上的分布式樣對(duì)象能夠相互通信。
10.5組件對(duì)象模型
組件對(duì)象模型(ComponentObjectModel,COM)是微軟(Microsoft)的組件軟件方案,是為組件的互操作而定義的二進(jìn)制組件模型。分布式組件對(duì)象模型(DistribntedComponentObjectModel,DCOM)是COM的一個(gè)分布式擴(kuò)充,是在分布式計(jì)算環(huán)境的遠(yuǎn)程過程調(diào)用的基礎(chǔ)上開發(fā)的。COM+是按COM的標(biāo)準(zhǔn)建立的,并組合了一些工具的新版本,如MTS(MicrosoftTransactionServer)、MSMQ(MicrosoftMessageQueues)等。
10.5.1COM標(biāo)準(zhǔn)
COM作為一面向?qū)ο蟮木幊棠P?,目的是提高軟件的交互協(xié)同工作能力,而不受開發(fā)語言和方法、運(yùn)行環(huán)境和地點(diǎn)的限制。
在Windows系統(tǒng)平臺(tái)上,一個(gè)COM組件或是一個(gè)DLL文件,或是一個(gè)EXE文件。
一個(gè)組件程序可以包含多個(gè)COM對(duì)象,每個(gè)COM對(duì)象可以實(shí)現(xiàn)多個(gè)接口。COM組件COM對(duì)象COM對(duì)象COM接口COM接口COM對(duì)象
在COM規(guī)范中,并沒有對(duì)COM對(duì)象進(jìn)行嚴(yán)格的定義。COM對(duì)象同C++語言中的類一樣,也包括屬性和方法。屬性反映了對(duì)象的狀態(tài),方法則是對(duì)象提供給外界的接口,客戶必須通過接口才能獲得對(duì)象的服務(wù)。COM對(duì)象以提供功能服務(wù)為主,可用來替代傳統(tǒng)的API(ApplicationProgrammingInterface)函數(shù)。
COM對(duì)象標(biāo)識(shí)客戶并不直接訪問COM組件,而是通過一個(gè)全局標(biāo)識(shí)符進(jìn)行對(duì)象的創(chuàng)建和初始化工作。在COM的規(guī)范中,每個(gè)對(duì)象有一個(gè)128位的全局惟一標(biāo)識(shí)符GUID(GloballyUniqueIdentifier)來標(biāo)識(shí),稱為CLSID(ClassIdentifier)。(GUID不是專門用來定義COM對(duì)象標(biāo)識(shí)符的,且GUID是一個(gè)隨機(jī)數(shù))COM庫提供了一個(gè)API函數(shù)產(chǎn)生GUID:
HRESULTCoCreateGuid(GUID*pguid);COM對(duì)象與C++對(duì)象的不同封裝性:COM對(duì)象只能通過其提供的接口成員函數(shù)訪問對(duì)象屬性;而C++有可能直接訪問對(duì)象中的數(shù)據(jù)成員??芍赜眯裕篊OM通過包容或聚合實(shí)現(xiàn)重用;而C++主要通過繼承實(shí)現(xiàn)重用??蛻魧?duì)象B對(duì)象AISomeInterfaceISomeInterfaceIOtherInterface客戶對(duì)象B對(duì)象AISomeInterfaceIOtherInterface包容聚合COM接口
COM規(guī)范的核心內(nèi)容是關(guān)于接口的定義。
COM接口有兩種:標(biāo)準(zhǔn)接口和用戶接口,用戶接口是用戶為COM對(duì)象設(shè)計(jì)的接口。標(biāo)準(zhǔn)接口是COM規(guī)范定義的,可用來訪問有關(guān)COM對(duì)象的信息。
在標(biāo)準(zhǔn)接口中,所有COM對(duì)象都預(yù)定要執(zhí)行IUnknown接口。如果要支持后期綁定,則需要IDispatch接口,其它還有與一組存儲(chǔ)有關(guān)的IPersist系列接口。
接口結(jié)構(gòu)類似于COM對(duì)象的標(biāo)識(shí),COM接口也采用GUID,稱為IID(interfaceidentifier).客戶使用一個(gè)COM對(duì)象的接口,必須知道接口的IID和接口提供的方法。接口指針PVtable指針指向功能1指向功能2…對(duì)象實(shí)現(xiàn)Vtable(virtualfunctiontable)(供客戶使用)標(biāo)準(zhǔn)接口IUnknownQueryInterface返回COM對(duì)象可否提供有關(guān)的接口服務(wù);函數(shù)輸入為接口標(biāo)識(shí)符。如果COM對(duì)象實(shí)現(xiàn)了該接口,則返回接口指針,否則返回空。AddRef和Release調(diào)用并處理COM對(duì)象引用計(jì)數(shù)器,用于管理COM對(duì)象的生命周期,每當(dāng)創(chuàng)建一個(gè)新的對(duì)已有COM對(duì)象的引用時(shí),AddRef方法便被調(diào)用,從而將COM對(duì)象引用計(jì)數(shù)加1。當(dāng)客戶不再需要時(shí),通過Release將引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)減到0時(shí),對(duì)象便清除自己。
接口定義語言(MIDL)微軟用其接口定義語言MIDL來精確定義接口,每一接口中的方法以及每一方法的參數(shù)。MicrosoftVC++提供了MIDL工具,可把IDL接口描述文件(*.idl)編譯成C/C++語言兼容的接口描述頭文件(*·h)供組件程序和客戶程序使用。
例子定義接口,并用MIDL編譯實(shí)現(xiàn):QueryInterface實(shí)現(xiàn):AddRef和Release實(shí)現(xiàn)用戶接口COM庫
在MicrosoftWindows操作系統(tǒng)環(huán)境下,COM庫以DLL文件的形式存在,其中包括以下幾項(xiàng)內(nèi)容:提供少量的API函數(shù),用來加速客戶和服務(wù)器COM應(yīng)用程序的創(chuàng)建;完成對(duì)象實(shí)現(xiàn)的定位服務(wù)。它根據(jù)唯一的類標(biāo)識(shí),通過系統(tǒng)注冊(cè)表來確定類和服務(wù)器實(shí)現(xiàn)的地址。實(shí)現(xiàn)透明的遠(yuǎn)過程調(diào)用,以支持在本地或遠(yuǎn)程服務(wù)器中運(yùn)行的對(duì)象。提供一套應(yīng)用程序如何控制其進(jìn)程空間里內(nèi)存的分配和釋放的標(biāo)準(zhǔn)機(jī)制。
COMAPI函數(shù)定位服務(wù)(方法1)COM庫注冊(cè)表組件程序如果是EXE,則會(huì)有一點(diǎn)點(diǎn)不同系統(tǒng)注冊(cè)表信息(windows2000)組件向系統(tǒng)注冊(cè)代碼同樣也應(yīng)有清除注冊(cè)用代碼!也可手工操作注冊(cè)表完成!類工廠(實(shí)現(xiàn)IClassFactory接口)用于控制組件的生存周期用于創(chuàng)建COM對(duì)象獲取類工廠10.5.2COM客戶/服務(wù)器模型客戶服務(wù)器進(jìn)程內(nèi)調(diào)用在進(jìn)程內(nèi),服務(wù)器組件和客戶程序運(yùn)行在同一地址空間中,一旦客戶程序與組件程序建立通信關(guān)系,客戶程序就可以通過得到的接口指針直接調(diào)用服務(wù)器對(duì)象的成員函數(shù)。
接口指針PVtable指針指向功能1指向功能2…對(duì)象實(shí)現(xiàn)Vtable(virtualfunctiontable)例子本地調(diào)用在同一機(jī)器上的不同進(jìn)程,COM采用了本地過程調(diào)用LPC(LocalProcedureCall)實(shí)現(xiàn)進(jìn)程外組件與客戶程序的通信。圖中虛線表明,對(duì)開發(fā)人員而言,不需考慮底層細(xì)節(jié),COM實(shí)現(xiàn)了進(jìn)程模型的透明,使得客戶程序調(diào)用接口成員函數(shù)好像是直接進(jìn)行的。
10.5.3分布式COM(DCOM)
對(duì)于組件程序與客戶程序不在同一主機(jī)的情形,DCOM則把COM的進(jìn)程模型的透明性拓展為位置透明性,把COM中本地跨進(jìn)程(同一主機(jī)不同進(jìn)程)通信用一個(gè)網(wǎng)絡(luò)協(xié)議傳輸過程來替代,組件程序和客戶程序均感覺不到中間發(fā)生的過程,只是中間數(shù)據(jù)傳遞的路線更長一些。
10.5.4COM+簡介
COM+COM+目錄負(fù)載平衡內(nèi)存數(shù)據(jù)庫對(duì)象池隊(duì)列組件新的事件模型組件管理和配置MTS事務(wù)支持資源分發(fā)管理安全模型易化管理COM/DCOM基于接口的編程遠(yuǎn)程支持基本組件服務(wù)分布式組件服務(wù)10.6EJB模型
1996年10月,SUN公司推出JavaBean。按SUN公司的定義,JavaBean是一種能在編程工具中被可視化處理的可復(fù)用的軟件組件。EJB規(guī)范是SUN公司于1997年12月發(fā)布的JavaBean組件模型。JavaBean組件是一種可用來組裝應(yīng)用程序的組件,不是一個(gè)完整的應(yīng)用程序,不能部署;EJB組件則是可部署的組件,用來完成服務(wù)器端的操作,需要賴以生存的運(yùn)行環(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適合可以可視化地操作從而完成某項(xiàng)功能的軟件。如:按鈕、標(biāo)簽等。類庫適合于對(duì)程序員提供一些功能,但并不太適合進(jìn)行可視化操作的模塊。如訪問JDBC數(shù)據(jù)庫的接口。JavaBeans與外部接口一個(gè)JavaBeans組件主要通過屬性、方法和事件來與外部環(huán)境進(jìn)行交互。JavaBeans屬性反映了組件的特征。JavaBeans引入了聯(lián)系和約束屬性。一個(gè)聯(lián)系屬性當(dāng)其值改變時(shí)通知其他對(duì)象;一個(gè)約束屬性值的改變可以被其他組件否決。JavaBeans自查自查(內(nèi)省)是在運(yùn)行時(shí)發(fā)現(xiàn)JavaBeans組件的屬性、方法和事件的過程。兩種方式:通過尋找遵循某種命名模式的類和方法(隱式提供信息);通過查詢某個(gè)類的BeanInfo。JavaBeans組件開發(fā)(JBuilder6)創(chuàng)建JavaBeans組件建立一個(gè)工程文件(File/NewProject);建立一個(gè)JavaBean類(File/New);設(shè)計(jì)界面(用戶窗口的Design標(biāo)簽);添加屬性和事件;編譯成Class文件;打包成JAR文件(Wizards/ArchiveBuilder).注冊(cè)JavaBeans組件(Tools/ConfigurePalette-AddComponent)按SelectLibrary按鈕;選Project后按New按鈕;按Add,選中打包后的文件名;按AddFromSelectedLibrary;按OK退出。//此后便可如同Jbutton一樣使用創(chuàng)建的組件10.6.2EJB體系結(jié)構(gòu)
EJB容器本地接口遠(yuǎn)程接口實(shí)體BeanEJB容器本地接口遠(yuǎn)程接口會(huì)話BeanJavaServelets或JavaServerPages或JavaApplication(RMI)客戶端數(shù)據(jù)庫EJB結(jié)構(gòu)要素EJB服務(wù)器是管理EJB容器的高端進(jìn)程或應(yīng)用程序,由開發(fā)商提供。EJB本地接口為客戶創(chuàng)建、刪除、查找EJB遠(yuǎn)程接口對(duì)象的句柄提供相應(yīng)的操作。本地對(duì)象是由EJB容器產(chǎn)生的對(duì)本地接口的實(shí)現(xiàn),用來創(chuàng)建EJB對(duì)象。EJB遠(yuǎn)程接口為EJB提供特定的業(yè)務(wù)客戶接口方法。EJB對(duì)象是由容器產(chǎn)生的對(duì)遠(yuǎn)程接口的實(shí)現(xiàn),所有客戶端的調(diào)用都要訪問EJB對(duì)象,EJB對(duì)象將調(diào)用委托給實(shí)體Bean(或會(huì)話Bean)的實(shí)例。會(huì)話Bean包含與商務(wù)處理相關(guān)的邏輯實(shí)現(xiàn)。實(shí)體Bean提供對(duì)企業(yè)數(shù)據(jù)的訪問。
本地接口和本地對(duì)象EJB容器和服務(wù)器本地對(duì)象EJB對(duì)象EJB客戶端程序3:返回EJB對(duì)象引用1:創(chuàng)建一個(gè)新的EJB對(duì)象
本地接口
遠(yuǎn)程接口2:創(chuàng)建EJB對(duì)象遠(yuǎn)程接口和EJB對(duì)象EJB容器和服務(wù)器EJB對(duì)象EJB客戶端程序5:返回結(jié)果1:調(diào)用一個(gè)方法事務(wù)服務(wù)安全服務(wù)2:調(diào)用J2EE服務(wù)4:方法返回3:調(diào)用BeanEJB運(yùn)行機(jī)制基于組件的應(yīng)用開發(fā)中的有關(guān)角色10.7可復(fù)用面向?qū)ο笤O(shè)計(jì)模式
面向?qū)ο笤O(shè)計(jì)模式最初出現(xiàn)于70年代末80年代初。1987年W.Cunningham和K.Beck引入建筑師C.Alexander的模式概念。
面向?qū)ο笤O(shè)計(jì)模式是普通面向?qū)ο笤O(shè)計(jì)問題的解決方案,這類問題以一組交互類的形式出現(xiàn),用戶根據(jù)需要定制這些交互類以形成專門的設(shè)計(jì)。作用:設(shè)計(jì)模式不僅使人們可以更加方便地復(fù)用成功設(shè)計(jì)方案,也能提高已有系統(tǒng)的文檔管理和系統(tǒng)維護(hù)的有效性。
10.7.1設(shè)計(jì)模式的描述與分類
一個(gè)設(shè)計(jì)模式事實(shí)上是系統(tǒng)地命名、解釋和評(píng)價(jià)某一重要的可重現(xiàn)的面向?qū)ο笤O(shè)計(jì)方案。所有設(shè)計(jì)均可從四個(gè)方面加以描述:模式名稱:用一至兩個(gè)詞描述設(shè)計(jì)問題、解決方案和效果。模式名稱便于使用者在更高的抽象層次上進(jìn)行設(shè)計(jì)并交流有關(guān)設(shè)計(jì)思想。問題描述:指明使得設(shè)計(jì)模式可以被應(yīng)用所必須存在的環(huán)境條件。它解釋了設(shè)計(jì)問題及其背景。解決方案:描述了設(shè)計(jì)方案的組成部分,它們之間的關(guān)系及各自的職責(zé)和協(xié)作方式。效果:描述應(yīng)用設(shè)計(jì)模式后的結(jié)果及使用模式應(yīng)權(quán)衡的問題。
Gamma分類類別設(shè)計(jì)模式名稱意圖簡要說明創(chuàng)建型模式抽象工廠(AbstractFactory)提供創(chuàng)建相關(guān)的或相互依賴的一族對(duì)象的接口而無需指定具體的類。生成器
(Builder)將一個(gè)復(fù)雜對(duì)象的創(chuàng)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。工廠方法
(FactoryMethod)定義一個(gè)用于創(chuàng)建對(duì)象的接口,由子類決定實(shí)例化哪一個(gè)類。原型(Prototype)使用一個(gè)原型指定要?jiǎng)?chuàng)建的類的類型,通過拷貝這個(gè)原型得到新的對(duì)象。單件
(Singleton)保證一類僅有一個(gè)實(shí)例,并提供一個(gè)全局性的訪問點(diǎn)。Gamma分類結(jié)構(gòu)型模式適配器
(Adapter)將一個(gè)類的接口轉(zhuǎn)換成用戶希望得到的另一種接口,使原來由于接口不相容而不能一起工作的類可一起工作。橋(Bridge)將類的抽象部分與它的實(shí)現(xiàn)部分分離,使它們可以相互獨(dú)立地變化。組合(Composite)將對(duì)象組成樹結(jié)構(gòu)來表示局部和整體的層次關(guān)系,使單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。裝飾
(Decorator)動(dòng)態(tài)地給一個(gè)對(duì)象添加新功能。外觀
(Fa?ade)給一個(gè)子系統(tǒng)的所有接口提供一個(gè)統(tǒng)一接口,使子系統(tǒng)便于使用。輕量
(Flyweight)運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象。類別設(shè)計(jì)模式名稱意圖簡要說明Gamma分類行為模式職責(zé)鏈
(ChainofResponsibility)將多個(gè)接收請(qǐng)求的對(duì)象連成一條鏈,并沿鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。避免了請(qǐng)求的發(fā)送者和接收者之間的耦合。命令(Command)將一個(gè)請(qǐng)求命令封閉優(yōu)一個(gè)對(duì)象,便于將不同的請(qǐng)求參數(shù)化;對(duì)請(qǐng)求排對(duì)或記錄請(qǐng)求日志,以及支持可撤消請(qǐng)求的操作。解釋器
(Interpreter)給定一種語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示解釋語言中的句子。迭代器(Iterator)提供一種順序訪問一個(gè)聚合對(duì)象中各元素又不暴露對(duì)象內(nèi)部表示的方法。中介者
(Mediator)定義一個(gè)中介對(duì)象封裝一系列對(duì)象的交互。備忘錄
(Memento)在不破壞封裝的條件下,獲得一個(gè)對(duì)象的內(nèi)部狀態(tài)并將它外部化,從而在以后可使對(duì)象恢復(fù)到這個(gè)狀態(tài)。觀察者
(Observer)定義對(duì)象一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象均得到通知并被自動(dòng)更新。狀態(tài)
(State)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來似乎能修改它的類。策略
(Strategy)定義一系列算法,把它們均封閉起來,并且使它們可相互替換。它使算法可獨(dú)立于使用者而變化。模板方法
(TemplateMethod)定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中,從而使子類可以不改變算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。訪問者
(Visitor)描述一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作,從而可以在不改變被操作元素類的條件下定義新的操作。類別設(shè)計(jì)模式名稱意圖簡要說明10.7.2創(chuàng)建型模式
創(chuàng)建型模式幫助系統(tǒng)獨(dú)立于對(duì)象的產(chǎn)生、組合和表示。作用:一方面均將關(guān)于系統(tǒng)使用哪些具體的類的信息封裝起來;另一方面隱蔽了這些具體類的實(shí)例是如何被創(chuàng)建和放在一起的。因此,創(chuàng)建型模式在“什么”被創(chuàng)建、“怎樣”被創(chuàng)建、“誰”創(chuàng)建它以及“何時(shí)”創(chuàng)建等方面帶來了很大的靈活性,有利于設(shè)計(jì)可復(fù)用的軟件成分。
工廠方法模式(結(jié)構(gòu))
《interface》Creator《interface》ProductConcreteProductfactoryMethod()ConcreteCreatorfactoryMethod()《creates》Client產(chǎn)品/具體產(chǎn)品類
Product定義工廠方法生成的對(duì)象的接口。例如:(Java程序)publicinterfaceProduct{//產(chǎn)品的接口聲明}ConcreteProduct實(shí)現(xiàn)Product類的接口。例如:publicclassConcreteProductimplementsProduct{//構(gòu)造函數(shù)publicConcreteProduct(){//dosomething}//產(chǎn)品接口實(shí)現(xiàn)}創(chuàng)建者/具體創(chuàng)建者類Creator聲明一個(gè)工廠,返回一個(gè)Product類型的對(duì)象。也可定義工廠方法的缺省實(shí)現(xiàn)??烧{(diào)用工廠方法生成一個(gè)Product對(duì)象。例如:publicinterfaceCreator{//工廠方法接口聲明
publicProductfactoryMethod();}ConcreteCreator重定義工廠方法以返回適當(dāng)?shù)腃oncreteProduct實(shí)例。例如:publicclassConcreteCreatorimplementsCreator{//工廠方法實(shí)現(xiàn)
publicProductfactoryMethod(){returnnewConcreteProduct();}}
客戶類Client僅使用由Creator和Product聲明的接口。例如:publicclassClient{privatestaticCreatorcreator;privatestaticProductproduct;publicstaticvoidmain(String[]args){creator=newConcreteCreator();product=creator.factoryMethod();//dootherthings}}使用條件一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類。一個(gè)類希望由其子類確定它創(chuàng)建的對(duì)象。類將創(chuàng)建對(duì)象的職責(zé)委派給多個(gè)幫助者子類中的一個(gè),且希望將哪一個(gè)幫助者子類是代表者這一信息局部化。
依賴倒置原則使用效果
比直接產(chǎn)生對(duì)象更靈活?!肮S方法”給子類一個(gè)掛鉤,以便在子類中擴(kuò)展。連接平行類層次。當(dāng)一個(gè)類將它的一些職責(zé)委托給一個(gè)獨(dú)立的類的時(shí)候,就會(huì)產(chǎn)生平行類層次。
《interface》FigurecreateManipulator()《interface》ManipulatordownClick()upClick()drag()LineManipulatordownClick()upClick()drag()TextManipulatordownClick()upClick()drag()TextFigurecreateManipulator()LineFigurecreateManipulator()Client結(jié)論工廠方法模式在遵循依賴倒置原則方面有重要意義,使得高層策略模塊在創(chuàng)建類的實(shí)例時(shí)無需依賴具體的類。也使得一組類的完全不同序列的實(shí)現(xiàn)間進(jìn)行交換成為可能。工廠方法模式會(huì)帶來復(fù)雜性。抽象工廠模式結(jié)構(gòu)《interface》AbstractFactorycreateProductA()createProductB()ConcreteFactory2createProductA()createProductB()ConcreteFactory1createProductA()createProductB()《interface》AbstractProductAConcreteProductA1ConcreteProductA2《interface》AbstractProductBConcreteProductB1ConcreteProductB2Client抽象工廠/具體工廠類AbstractFactory聲明創(chuàng)建抽象產(chǎn)品對(duì)象的操作接口。例如:publicinterfaceAbstractFactory{//產(chǎn)品等級(jí)結(jié)構(gòu)A的工廠方法
publicAbstractProductAcreateProductA();//產(chǎn)品等級(jí)結(jié)構(gòu)B的工廠方法
publicAbstractProductBcreateProductB();}ConcreteFactoryl實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對(duì)象的操作。例如:publicclassConcreteFactory1{//產(chǎn)品族1的具體工廠類
//產(chǎn)品等級(jí)結(jié)構(gòu)A的工廠方法
publicAbstractProductAcreateProductA(){returnnewConcreteProductA1();}//產(chǎn)品等級(jí)結(jié)構(gòu)B的工廠方法
publicAbstractProductBcreateProductB(){returnnewConcreteProductB1();}}//產(chǎn)品族2的具體工廠類的實(shí)現(xiàn)與產(chǎn)品族1的具體工廠類類似
抽象產(chǎn)品/具體產(chǎn)品類AbstractProductA聲明一種產(chǎn)品對(duì)象的接口。例如:publicinterfaceAbstractProductA{//接口聲明}//AbstractProductB與AbstractProductA類似
ConcreteProductA1定義將被相應(yīng)的具體工廠類創(chuàng)建的產(chǎn)品對(duì)象;實(shí)現(xiàn)抽象產(chǎn)品類接口。例如:publicclassConcreteProductA1implementsAbstractProductA{//構(gòu)造函數(shù)publicConcreteProductA1(){}//接口實(shí)現(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)由多個(gè)產(chǎn)品族之一來配置。強(qiáng)調(diào)一系列相關(guān)產(chǎn)品對(duì)象的設(shè)計(jì)以便聯(lián)合使用。提供一個(gè)產(chǎn)品類庫,但只想顯示它們的接口。
使用效果
隔離了具體的類。使產(chǎn)品族間的轉(zhuǎn)換容易進(jìn)行。容易實(shí)現(xiàn)一個(gè)應(yīng)用一次只使用同一個(gè)系統(tǒng)中的產(chǎn)品對(duì)象。難以擴(kuò)展“抽象工廠”以支持新種類的產(chǎn)品。
不符合開閉原則10.7.3結(jié)構(gòu)型模式
結(jié)構(gòu)型模式涉及如何組合類和對(duì)象構(gòu)成更大的結(jié)構(gòu)。一種方法是采用繼承機(jī)制來組合接口或?qū)崿F(xiàn)來形成更大的結(jié)構(gòu);另一種方法通過對(duì)象組合方式對(duì)一些對(duì)象進(jìn)行組合來形成。由于對(duì)象組合可以在運(yùn)行時(shí)刻改變,而繼承機(jī)制為靜態(tài)類組合,因而對(duì)象組合方式具有更大的靈活性。
適配器模式結(jié)構(gòu)ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用繼承機(jī)制ClientAdapteeoperation()《interface》Targetrequest()Adapterrequest()利用組合機(jī)制目標(biāo)/被適配者類Target定義客戶類使用的與特定領(lǐng)域相關(guān)的接口。例如:publicinterfaceTarget{//定義用戶期望的接口
publicvoidrequest();}Adaptee定義一個(gè)被用來適配的已存在的接口。例如:publicclassAdaptee{//被適配的接口
publicvoidoperation(){//dosomething}}
適配器類(利用繼承機(jī)制)Adapter適配Adaptee類中的接口至Target類中的接口。例如://利用繼承機(jī)制publicclassAdapterextendsAdapteeimplementsTarget{//適配operation為requestpublicvoidrequest(){//調(diào)用operationoperation();}}適配器類(利用組合機(jī)制)//利用對(duì)象組合publicclassAdapterimplementsTarget{privateAdapteeadaptee;//構(gòu)造函數(shù)
publicAdapter(Adapteeadaptee){this.adaptee=adaptee;}//適配operation為requestpublicvoidrequest(){//dootherthingsadaptee.operation();//dootherthings}}
客戶類Client使用Target類中的接口。例如://利用繼承機(jī)制publicclassClient{privatestaticTargettarget;publicstaticvoidmain(String[]args){target=newAdapter();//以后可通過調(diào)用target.request()調(diào)用adaptee定義的operation()//dootherthings}}客戶類//利用對(duì)象組合publicclassClient{privatestaticTargettarget;privatestaticAdapteeadaptee;publicstaticvoidmain(String[]args){target=newAdapter(adaptee);//以后可通過調(diào)用target.request()調(diào)用adaptee定義的operation()//dootherthings}}
使用條件希望使用一個(gè)已存在的類,它的接口卻與希望的接口不匹配。要?jiǎng)?chuàng)建一個(gè)可復(fù)用的類,該類可以與其它不相關(guān)的類或不可預(yù)見的類協(xié)同工作。想使用一些已存在的類,但不能對(duì)每一個(gè)類子類化以匹配它們的接口(僅適用于對(duì)象組合的適配器模式)。
使用效果a、對(duì)利用繼承機(jī)制的情況:當(dāng)想要匹配Adaptee類及其所有子類時(shí),Adapter類將不能勝任。Adapter類可以重定義Adaptee類的行為。不需要間接指針以得到adaptee對(duì)象。b、對(duì)利用對(duì)象組合的情況:允許一個(gè)Adapter類與多個(gè)Adaptee類一起工作。重定義Adaptee類的行為比較困難。
組合模式(結(jié)構(gòu))
Client《interface》Componentoperation()add(Component)Remove(Component)getChild(int)Leafoperation()Compositeoperation()add(Component)Remove(Component)getChild(int)children部件類Component為組合中的對(duì)象聲明接口;在適當(dāng)?shù)那闆r下實(shí)現(xiàn)所有類共有接口的缺省行為;聲明接口用于訪問和管理組合對(duì)象中的子部件。例如:publicinterfaceComponent{//operationpublicStringtoString();//聲明接口publicvoidadd(Componentcomponent);publicvoidremove(Componentcomponent);publicComponentgetChild(intindex);}
葉子類Leaf代表部件中的葉子對(duì)象,它沒有子部件;定義組合對(duì)象中原始對(duì)象的行為;對(duì)與子部件有關(guān)的操作接口實(shí)現(xiàn)為空。例如:publicclassLeafimplementsComponent{protectedintid=0;//標(biāo)識(shí)號(hào)
publicLeaf(intid){this.id=id;}publicStringtoString(){return(“IamLeaf(ID“+id+“)”);}publicvoidadd(Componentcomponent){}publicvoidremove(Componentcomponent){}publicComponentgetChild(intindex){returnnull;}}
組合類Composite定義有子部件的部件的行為;存儲(chǔ)子部件;實(shí)現(xiàn)Component類接口中與子部件有關(guān)的操作。例如:importjava.util.LinkedList;publicclassCompositeimplementsComponent{protectedLinkedListchildren=newLinkedList();protectedintid=0;//標(biāo)識(shí)號(hào)
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通過部件類接口操作組合中的對(duì)象。例如: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}}
使用條件
希望表示對(duì)象的整體/部分層次結(jié)構(gòu)。希望一致地處理葉子對(duì)象和組合對(duì)象。使用效果
定義了對(duì)象的整體/部分層次結(jié)構(gòu),且客戶代碼中任何用到葉子對(duì)象的地方均可使用組合對(duì)象。簡化了客戶代碼,客戶代碼不必關(guān)心處理的是一個(gè)葉子對(duì)象還是組合對(duì)象,即可以一致地使用葉子對(duì)象和組合對(duì)象。易于添加新的Composite和Leaf子類,客戶代碼不必因新的Composite和Leaf子類而改變。使設(shè)計(jì)更加通用,但難于限制只組合某些特定的部件。
10.7.4行為型模式
行為型模式不僅描述對(duì)象或類的模式,還描述它們之間的通信模式。這些模式刻劃了在運(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。行為型模式使設(shè)計(jì)者的注意力從控制流轉(zhuǎn)移到對(duì)象間的聯(lián)系方式上。
迭代器模式結(jié)構(gòu)
{abstract}AggregateCreateIterator()ConcreteAggregateCreateIterator()《interface》Iteratorfirst()next()isDone()currentItem()ConcreteIteratorfirst()next()isDone()currentItem()Client迭代器類Iterator定義訪問和遍歷聚合(aggregate)對(duì)象的接口。例如:publicinterfaceIterator{publicvoidfirst();publicvoidnext();publicbooleanisDone();publicObjectcurrentItem();}
具體迭代器類ConcreteIterator實(shí)現(xiàn)Iterator類中的接口;在聚合對(duì)象遍歷時(shí)跟蹤當(dāng)前位置。例如: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)迭代器對(duì)象的接口。例如:abstractpublicclassAggregate{publicIteratorcreateIterator(){returnnull;}}
ConcreteAggregate實(shí)現(xiàn)Aggregate類中的接口,返回ConcreteIterator類的一個(gè)適當(dāng)?shù)膶?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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣壓釜項(xiàng)目可行性研究報(bào)告評(píng)審方案設(shè)計(jì)(2025年標(biāo)準(zhǔn)案例范文)
- 衣架、衣夾行業(yè)市場發(fā)展及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- LED智能照明燈項(xiàng)目可行性研究報(bào)告申請(qǐng)立項(xiàng)
- 2025年油田井口裝置套管頭項(xiàng)目可行性研究報(bào)告
- 2025年中國抗生素檢測行業(yè)市場調(diào)研分析及投資戰(zhàn)略規(guī)劃報(bào)告
- 在線教育行業(yè)發(fā)展趨勢預(yù)測及投資規(guī)劃研究報(bào)告
- 小麥面粉生產(chǎn)線技改項(xiàng)目可行性研究報(bào)告建議書
- 2025柏房小學(xué)營養(yǎng)餐供銷合同
- 2025集資房買賣合同樣本
- 2025從德國功能主義看國際商務(wù)英語合同的漢譯策略碩士學(xué)位
- 2025年1月普通高等學(xué)校招生全國統(tǒng)一考試適應(yīng)性測試(八省聯(lián)考)英語試題
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之21:“7支持-7.5成文信息”(雷澤佳編制-2025B0)
- 2024年度大數(shù)據(jù)支撐下的B2B電子商務(wù)購銷服務(wù)合同3篇
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測試語文試卷(含答案)
- 2023-2024年電商直播行業(yè)現(xiàn)狀及發(fā)展趨勢研究報(bào)告
- 【9歷期末】安徽省利辛縣部分學(xué)校2023~2024學(xué)年九年級(jí)上學(xué)期期末考試歷史試卷
- GB/T 44949-2024智能熱沖壓成形生產(chǎn)線
- 阜陽市重點(diǎn)中學(xué)2025屆高考數(shù)學(xué)全真模擬密押卷含解析
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報(bào)
- 2024-2025學(xué)年統(tǒng)編版七年級(jí)語文上學(xué)期期末真題復(fù)習(xí) 專題01 古詩文名篇名句默寫
- 2024-2030年中國企業(yè)大學(xué)建設(shè)行業(yè)轉(zhuǎn)型升級(jí)模式及投資規(guī)劃分析報(bào)告
評(píng)論
0/150
提交評(píng)論