版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1軟件體系結(jié)構(gòu)
第8講:設(shè)計(jì)模式(一)江賀2內(nèi)容簡(jiǎn)介:設(shè)計(jì)模式概念設(shè)計(jì)模式的描述實(shí)例研究:文檔編輯器LexiLexi的文檔結(jié)構(gòu)與組合(Composite)模式3設(shè)計(jì)模式概念ChristopherAlexander:“每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題,以及該問(wèn)題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復(fù)的工作?!薄对O(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》:設(shè)計(jì)模式是“對(duì)被用來(lái)在特定場(chǎng)景下解決一般設(shè)計(jì)問(wèn)題的類和相互通信的對(duì)象的描述”4設(shè)計(jì)模式概念設(shè)計(jì)模式的四個(gè)基本要素:模式名稱(PatternName):一個(gè)助記名,它用一兩個(gè)詞來(lái)描述模式的問(wèn)題、解決方案和效果。問(wèn)題(Problem):描述了應(yīng)該在何時(shí)使用模式。解決方案(Solution)描述了設(shè)計(jì)的組成部分,它們之間的相互關(guān)系和各自的職責(zé)和協(xié)作方式。效果(Consequence)描述了模式應(yīng)用的效果及使用模式應(yīng)該權(quán)衡的問(wèn)題。5設(shè)計(jì)模式概念6設(shè)計(jì)模式的描述模式名和分類模式名簡(jiǎn)潔地描述了模式的本質(zhì)。模式可以分為創(chuàng)建型、結(jié)構(gòu)型、行為型。意圖是回答下列問(wèn)題的簡(jiǎn)單陳述:設(shè)計(jì)模式是做什么的?它的基本原理和意圖是什么?它解決的是什么樣的特定設(shè)計(jì)問(wèn)題?別名模式的其他名稱。7設(shè)計(jì)模式的描述動(dòng)機(jī)舉例說(shuō)明一個(gè)設(shè)計(jì)問(wèn)題以及如何用模式中的類、對(duì)象來(lái)解決該問(wèn)題的特定情境。該情景會(huì)幫助你理解隨后對(duì)模式更抽象的描述。適用性在什么情況下可以使用該模式?該模式可以用來(lái)改進(jìn)哪些不良設(shè)計(jì)?你怎樣識(shí)別這些情況?結(jié)構(gòu)對(duì)模式中的類進(jìn)行圖形描述,說(shuō)明對(duì)象之間的請(qǐng)求序列和協(xié)作關(guān)系。8設(shè)計(jì)模式的描述參與者設(shè)計(jì)模式中的各個(gè)對(duì)象、類以及它們各自的職責(zé)。協(xié)作模式的參與者如何協(xié)作以實(shí)現(xiàn)它們的職責(zé)。效果模式怎樣支持它的目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨(dú)立改變?9設(shè)計(jì)模式的描述實(shí)現(xiàn)實(shí)現(xiàn)模式時(shí)需要知道的一些提示、技術(shù)要點(diǎn)及應(yīng)該避免的缺陷,以及是否存在某些特定于實(shí)現(xiàn)語(yǔ)言的問(wèn)題。代碼示例用C++/Smalltalk實(shí)現(xiàn)該模式的代碼片段。已知應(yīng)用實(shí)際應(yīng)用系統(tǒng)中發(fā)現(xiàn)該模式的例子。相關(guān)模式10實(shí)例研究:文檔編輯器Lexi11實(shí)例研究:文檔編輯器LexiLexi設(shè)計(jì)中的7個(gè)問(wèn)題文檔結(jié)構(gòu):文本的數(shù)據(jù)結(jié)構(gòu)安排。所有的編輯、格式安排、顯示和文本分析都涉及到這樣的文檔結(jié)構(gòu)。格式化:Lexi是如何來(lái)創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的?那些對(duì)象負(fù)責(zé)不同的格式化策略?修飾用戶界面:Lexi的用戶界面包括滾動(dòng)條、邊界和用來(lái)修飾文檔界面的陰影。12實(shí)例研究:文檔編輯器Lexi支持多種視感標(biāo)準(zhǔn)(look-and-feel):Lexi應(yīng)該不需做較大修改即可以適應(yīng)不同的視感標(biāo)準(zhǔn),如Motif支持多種窗口系統(tǒng):不同視感標(biāo)準(zhǔn)通常是在不同的窗口系統(tǒng)上實(shí)現(xiàn)的。Lexi的設(shè)計(jì)應(yīng)該盡可能獨(dú)立于窗口系統(tǒng)。用戶操作:用戶通過(guò)不同的界面操作Lexi,包括按鈕和下拉菜單。拼寫檢查和連字符:Lexi如何支持像拼寫檢查和決定連字符的連字點(diǎn)這樣的分析操作?當(dāng)我們不得不增加一個(gè)新的分析操作時(shí),如何盡量少修改相關(guān)類。13Lexi的文檔結(jié)構(gòu)與組合(Composite)模式Lexi考慮的其實(shí)是如何來(lái)安排字符、線段、多邊形、圖像等的基本元素。用戶使用Lexi過(guò)程中,希望操作的既可以是單個(gè)字符、也可以是行、欄、表格、頁(yè)等。行、欄、表格、頁(yè)等都屬于子結(jié)構(gòu),而這些子結(jié)構(gòu)又可以包含更小粒度的子結(jié)構(gòu)。字符、線段等可以看作是不包含子結(jié)構(gòu)的原子型結(jié)構(gòu)。14Lexi的文檔結(jié)構(gòu)與組合(Composite)模式字符、圖片、行、欄15Lexi的文檔結(jié)構(gòu)與組合(Composite)模式字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的關(guān)系欄行16字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的動(dòng)作基本一樣:Draw在屏幕上畫出自己Intersects判斷當(dāng)前光標(biāo)是否落在自己上面字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的均可以從同一個(gè)基類繼承而來(lái)。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式17圖元18字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的均從圖元繼承而來(lái)。其中,比如行、欄等類中包含了大量的成員變量,這些成員變量又是圖元的實(shí)例。字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的這種關(guān)系,實(shí)際上就是一種組合(Composite)模式Lexi的文檔結(jié)構(gòu)與組合(Composite)模式19組合(Composite)模式意圖將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對(duì)于單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式20組合(Composite)模式動(dòng)機(jī)在圖形編輯器和圖形捕獲系統(tǒng)這樣的應(yīng)用程序中,用戶可以使用簡(jiǎn)單的構(gòu)件創(chuàng)建復(fù)雜的圖表。用戶可以組合多個(gè)簡(jiǎn)單構(gòu)件以形成一些較大的構(gòu)件,而這些構(gòu)件又可以組合成更大的構(gòu)件。一種簡(jiǎn)單實(shí)現(xiàn)方法是將不同粒度的構(gòu)件用不同的類來(lái)定義,例如為字符、線等簡(jiǎn)單圖元定義一些類,而為行、欄定義另外一些類作為簡(jiǎn)單圖元的容器類。但是用戶在使用過(guò)程中可能將這些容器類的行為看成和簡(jiǎn)單圖元類一樣!而Composite模式試圖解決這樣的問(wèn)題,它描述了如何使用遞歸組合,使得用戶不必對(duì)這些類進(jìn)行區(qū)別,如圖所示。 Lexi的文檔結(jié)構(gòu)與組合(Composite)模式21抽象基類既要能夠反映原子圖元的特性,又要能夠反映一般子結(jié)構(gòu)的特性2223組合(Composite)模式適用性在以下情況下使用Composite模式希望表示對(duì)象的部分-整體層次結(jié)構(gòu)希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式24Lexi的文檔結(jié)構(gòu)與組合(Composite)模式組合(Composite)模式結(jié)構(gòu)25Lexi的文檔結(jié)構(gòu)與組合(Composite)模式26組合(Composite)模式參與者Component(Graphic)為組合中的對(duì)象聲明接口在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為聲明一個(gè)接口用于訪問(wèn)和管理Component的子組件在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問(wèn)一個(gè)父組件,并在合適的情況下實(shí)現(xiàn)它Leaf(Rectangle,Line,Text等)在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)在組合中定義圖元對(duì)象的行為Composite(Picture)定義有子部件的那些部件的行為存儲(chǔ)子部件在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作。Client通過(guò)Component接口操縱組合部件的對(duì)象。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式27組合(Composite)模式協(xié)作用戶使用Component類接口與組合結(jié)構(gòu)中的對(duì)象進(jìn)行交互。如果接受者是一個(gè)葉節(jié)點(diǎn),則直接處理請(qǐng)求。如果接受者是Composite,則它通常將請(qǐng)求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請(qǐng)求前/后可能執(zhí)行一些輔助性操作。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式28組合(Composite)模式效果定義了包含基本對(duì)象和組合對(duì)象的類層次結(jié)構(gòu)基本對(duì)象可以被組合成更復(fù)雜的組合對(duì)象,而這個(gè)組合對(duì)象又可以被組合。簡(jiǎn)化客戶代碼客戶可以一致地使用組合結(jié)構(gòu)和單個(gè)對(duì)象。通??蛻舨恢酪膊魂P(guān)心處理的是一個(gè)葉節(jié)點(diǎn)還是一個(gè)組合組件。這就簡(jiǎn)化了客戶代碼,因?yàn)樵诙x組合的那些類中不需要寫一些充斥著選擇語(yǔ)句的函數(shù)。使得更容易增加新類型的組件新定義的Composite或Leaf子類自動(dòng)地與已有的結(jié)構(gòu)和客戶代碼一起工作,客戶程序不需因新的Component類而改變。使你的設(shè)計(jì)變得更加一般化Lexi的文檔結(jié)構(gòu)與組合(Composite)模式29組合(Composite)模式實(shí)現(xiàn)(需要考慮以下幾個(gè)問(wèn)題)顯式的父部件引用共享組件最大化Component接口聲明管理子部件的操作Component是否應(yīng)該實(shí)現(xiàn)一個(gè)Component列表子部件排序使用高速緩沖存儲(chǔ)改善性能應(yīng)該由誰(shuí)刪除Component存儲(chǔ)組件最好用哪一種數(shù)據(jù)結(jié)構(gòu)Lexi的文檔結(jié)構(gòu)與組合(Composite)模式30代碼示例計(jì)算機(jī)和立體聲組合音響這樣的設(shè)備經(jīng)常被組裝成部分-整體層次結(jié)構(gòu)或者是容器層次結(jié)構(gòu)。例如,底盤可以包含驅(qū)動(dòng)裝置和平面板,總線包含多個(gè)插件,機(jī)柜包括底盤、總線等。這種結(jié)構(gòu)可以很自然地用Composite模式進(jìn)行模擬。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式31代碼示例Equipment類為在部分-整體層次結(jié)構(gòu)中的所有設(shè)備定義一個(gè)接口。classEquipment{public:virtual~Equipment();constchar*Name(){return_name;}virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();virtualvoidAdd(Equipment*);virtualvoidRemove(Equipment*);virtualIterator*CreateIterator();protected: Equipment(constchar*);private: constchar*_name;};
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式32代碼示例Equipment的子類包括表示磁盤驅(qū)動(dòng)器、集成電路和開(kāi)關(guān)的Leaf類:classFloppyDisk:publicEquipment{public: FloppyDisk(constchar*); virtual~FloppyDisk(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice();};
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式33代碼示例CompositeEquipment是包含其他設(shè)備的基類,它也是Equipment的子類。classCompositeEquipment:publicEquipment{public: virtual~CompositeEquipment(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice(); virtualvoidAdd(Equipment*); virtualvoidRemove(Equipment*); virtualIterator*CreateIterator();protected: CompositeEquipment(constchar*);private: List_equipment;};
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式34代碼示例NetPrice的缺省實(shí)現(xiàn)使用CreateIterator來(lái)累加子設(shè)備的實(shí)際價(jià)格。CurrencyCompositeEquipment::NetPrice(){Iterator*i=CreateIterator();Currencytotal=0;for(i->First();!i->IsDone();i->Next()){total+=i->CurrentItem()->NetPrice();}deletei;returntotal;}
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式35代碼示例計(jì)算機(jī)的底盤被表示為CompositeEquipment的子類Chassis.classChassis:publicCompositeEquipment{public:Chassis(constchar*);virtual~Chassis();virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();};
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式36代碼示例采取類似Chassis的方法來(lái)定義Cabinet和Bus.這樣就得到了組裝個(gè)人計(jì)算機(jī)所需的所有設(shè)備。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式EquipmentFloppyDiskCompositeEquipmentchildrenChassisCabine
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度畜禽養(yǎng)殖場(chǎng)地租賃及管理服務(wù)協(xié)議3篇
- 二零二五年度公司股權(quán)轉(zhuǎn)讓與員工安置保障合同3篇
- 2025年度年度合伙開(kāi)設(shè)甜品店合同3篇
- 二零二五年度農(nóng)業(yè)科技公司聘用兼職農(nóng)業(yè)技術(shù)員合同書3篇
- 2025年度農(nóng)村土地租賃與農(nóng)業(yè)產(chǎn)業(yè)化項(xiàng)目合作協(xié)議2篇
- 2025年度超市綠色環(huán)保供應(yīng)鏈合作協(xié)議書3篇
- 2025年度農(nóng)村保潔員工作績(jī)效評(píng)估合同2篇
- 2025年常用食品供貨合同模板范文
- 2025年度國(guó)有土地租賃協(xié)議合同(科技孵化器)3篇
- 二零二五年度智能硬件內(nèi)部股東股權(quán)轉(zhuǎn)讓合同模板3篇
- 基于多元回歸的計(jì)量經(jīng)濟(jì)學(xué)論文
- 數(shù)字媒體專業(yè)發(fā)展規(guī)劃
- 項(xiàng)目風(fēng)險(xiǎn)預(yù)測(cè)與防范事故應(yīng)急預(yù)案
- 15D502等電位連接安裝圖集
- DB44-T 1641-2015 LED 洗墻燈地方標(biāo)準(zhǔn)
- 網(wǎng)絡(luò)攻防試題集合
- Cpk 計(jì)算標(biāo)準(zhǔn)模板
- 靜脈留置針的日常維護(hù)
- 2023年消費(fèi)者咨詢業(yè)務(wù)試題及答案
- 推土機(jī)的應(yīng)用
- STK基礎(chǔ)教程學(xué)習(xí)版
評(píng)論
0/150
提交評(píng)論