版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1軟件體系結(jié)構(gòu)
第8講:設(shè)計模式(一)江賀2內(nèi)容簡介:設(shè)計模式概念設(shè)計模式的描述實例研究:文檔編輯器LexiLexi的文檔結(jié)構(gòu)與組合(Composite)模式3設(shè)計模式概念ChristopherAlexander:“每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復(fù)的工作。”《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》:設(shè)計模式是“對被用來在特定場景下解決一般設(shè)計問題的類和相互通信的對象的描述”4設(shè)計模式概念設(shè)計模式的四個基本要素:模式名稱(PatternName):一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。問題(Problem):描述了應(yīng)該在何時使用模式。解決方案(Solution)描述了設(shè)計的組成部分,它們之間的相互關(guān)系和各自的職責(zé)和協(xié)作方式。效果(Consequence)描述了模式應(yīng)用的效果及使用模式應(yīng)該權(quán)衡的問題。5設(shè)計模式概念6設(shè)計模式的描述模式名和分類模式名簡潔地描述了模式的本質(zhì)。模式可以分為創(chuàng)建型、結(jié)構(gòu)型、行為型。意圖是回答下列問題的簡單陳述:設(shè)計模式是做什么的?它的基本原理和意圖是什么?它解決的是什么樣的特定設(shè)計問題?別名模式的其他名稱。7設(shè)計模式的描述動機(jī)舉例說明一個設(shè)計問題以及如何用模式中的類、對象來解決該問題的特定情境。該情景會幫助你理解隨后對模式更抽象的描述。適用性在什么情況下可以使用該模式?該模式可以用來改進(jìn)哪些不良設(shè)計?你怎樣識別這些情況?結(jié)構(gòu)對模式中的類進(jìn)行圖形描述,說明對象之間的請求序列和協(xié)作關(guān)系。8設(shè)計模式的描述參與者設(shè)計模式中的各個對象、類以及它們各自的職責(zé)。協(xié)作模式的參與者如何協(xié)作以實現(xiàn)它們的職責(zé)。效果模式怎樣支持它的目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨立改變?9設(shè)計模式的描述實現(xiàn)實現(xiàn)模式時需要知道的一些提示、技術(shù)要點及應(yīng)該避免的缺陷,以及是否存在某些特定于實現(xiàn)語言的問題。代碼示例用C++/Smalltalk實現(xiàn)該模式的代碼片段。已知應(yīng)用實際應(yīng)用系統(tǒng)中發(fā)現(xiàn)該模式的例子。相關(guān)模式10實例研究:文檔編輯器Lexi11實例研究:文檔編輯器LexiLexi設(shè)計中的7個問題文檔結(jié)構(gòu):文本的數(shù)據(jù)結(jié)構(gòu)安排。所有的編輯、格式安排、顯示和文本分析都涉及到這樣的文檔結(jié)構(gòu)。格式化:Lexi是如何來創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的?那些對象負(fù)責(zé)不同的格式化策略?修飾用戶界面:Lexi的用戶界面包括滾動條、邊界和用來修飾文檔界面的陰影。12實例研究:文檔編輯器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)上實現(xiàn)的。Lexi的設(shè)計應(yīng)該盡可能獨立于窗口系統(tǒng)。用戶操作:用戶通過不同的界面操作Lexi,包括按鈕和下拉菜單。拼寫檢查和連字符:Lexi如何支持像拼寫檢查和決定連字符的連字點這樣的分析操作?當(dāng)我們不得不增加一個新的分析操作時,如何盡量少修改相關(guān)類。13Lexi的文檔結(jié)構(gòu)與組合(Composite)模式Lexi考慮的其實是如何來安排字符、線段、多邊形、圖像等的基本元素。用戶使用Lexi過程中,希望操作的既可以是單個字符、也可以是行、欄、表格、頁等。行、欄、表格、頁等都屬于子結(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)的動作基本一樣:Draw在屏幕上畫出自己Intersects判斷當(dāng)前光標(biāo)是否落在自己上面字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的均可以從同一個基類繼承而來。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式17圖元18字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的均從圖元繼承而來。其中,比如行、欄等類中包含了大量的成員變量,這些成員變量又是圖元的實例。字符、線段等原子型結(jié)構(gòu)與一般子結(jié)構(gòu)的這種關(guān)系,實際上就是一種組合(Composite)模式Lexi的文檔結(jié)構(gòu)與組合(Composite)模式19組合(Composite)模式意圖將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對于單個對象和組合對象的使用具有一致性。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式20組合(Composite)模式動機(jī)在圖形編輯器和圖形捕獲系統(tǒng)這樣的應(yīng)用程序中,用戶可以使用簡單的構(gòu)件創(chuàng)建復(fù)雜的圖表。用戶可以組合多個簡單構(gòu)件以形成一些較大的構(gòu)件,而這些構(gòu)件又可以組合成更大的構(gòu)件。一種簡單實現(xiàn)方法是將不同粒度的構(gòu)件用不同的類來定義,例如為字符、線等簡單圖元定義一些類,而為行、欄定義另外一些類作為簡單圖元的容器類。但是用戶在使用過程中可能將這些容器類的行為看成和簡單圖元類一樣!而Composite模式試圖解決這樣的問題,它描述了如何使用遞歸組合,使得用戶不必對這些類進(jìn)行區(qū)別,如圖所示。 Lexi的文檔結(jié)構(gòu)與組合(Composite)模式21抽象基類既要能夠反映原子圖元的特性,又要能夠反映一般子結(jié)構(gòu)的特性2223組合(Composite)模式適用性在以下情況下使用Composite模式希望表示對象的部分-整體層次結(jié)構(gòu)希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式24Lexi的文檔結(jié)構(gòu)與組合(Composite)模式組合(Composite)模式結(jié)構(gòu)25Lexi的文檔結(jié)構(gòu)與組合(Composite)模式26組合(Composite)模式參與者Component(Graphic)為組合中的對象聲明接口在適當(dāng)?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為聲明一個接口用于訪問和管理Component的子組件在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父組件,并在合適的情況下實現(xiàn)它Leaf(Rectangle,Line,Text等)在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點在組合中定義圖元對象的行為Composite(Picture)定義有子部件的那些部件的行為存儲子部件在Component接口中實現(xiàn)與子部件有關(guān)的操作。Client通過Component接口操縱組合部件的對象。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式27組合(Composite)模式協(xié)作用戶使用Component類接口與組合結(jié)構(gòu)中的對象進(jìn)行交互。如果接受者是一個葉節(jié)點,則直接處理請求。如果接受者是Composite,則它通常將請求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請求前/后可能執(zhí)行一些輔助性操作。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式28組合(Composite)模式效果定義了包含基本對象和組合對象的類層次結(jié)構(gòu)基本對象可以被組合成更復(fù)雜的組合對象,而這個組合對象又可以被組合。簡化客戶代碼客戶可以一致地使用組合結(jié)構(gòu)和單個對象。通??蛻舨恢酪膊魂P(guān)心處理的是一個葉節(jié)點還是一個組合組件。這就簡化了客戶代碼,因為在定義組合的那些類中不需要寫一些充斥著選擇語句的函數(shù)。使得更容易增加新類型的組件新定義的Composite或Leaf子類自動地與已有的結(jié)構(gòu)和客戶代碼一起工作,客戶程序不需因新的Component類而改變。使你的設(shè)計變得更加一般化Lexi的文檔結(jié)構(gòu)與組合(Composite)模式29組合(Composite)模式實現(xiàn)(需要考慮以下幾個問題)顯式的父部件引用共享組件最大化Component接口聲明管理子部件的操作Component是否應(yīng)該實現(xiàn)一個Component列表子部件排序使用高速緩沖存儲改善性能應(yīng)該由誰刪除Component存儲組件最好用哪一種數(shù)據(jù)結(jié)構(gòu)Lexi的文檔結(jié)構(gòu)與組合(Composite)模式30代碼示例計算機(jī)和立體聲組合音響這樣的設(shè)備經(jīng)常被組裝成部分-整體層次結(jié)構(gòu)或者是容器層次結(jié)構(gòu)。例如,底盤可以包含驅(qū)動裝置和平面板,總線包含多個插件,機(jī)柜包括底盤、總線等。這種結(jié)構(gòu)可以很自然地用Composite模式進(jìn)行模擬。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式31代碼示例Equipment類為在部分-整體層次結(jié)構(gòu)中的所有設(shè)備定義一個接口。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ū)動器、集成電路和開關(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的缺省實現(xiàn)使用CreateIterator來累加子設(shè)備的實際價格。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ī)的底盤被表示為CompositeEquipment的子類Chassis.classChassis:publicCompositeEquipment{public:Chassis(constchar*);virtual~Chassis();virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();};
Lexi的文檔結(jié)構(gòu)與組合(Composite)模式36代碼示例采取類似Chassis的方法來定義Cabinet和Bus.這樣就得到了組裝個人計算機(jī)所需的所有設(shè)備。Lexi的文檔結(jié)構(gòu)與組合(Composite)模式EquipmentFloppyDiskCompositeEquipmentchildrenChassisCabine
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度培訓(xùn)班業(yè)務(wù)轉(zhuǎn)讓協(xié)議典范
- 2024年化工廠房租賃協(xié)議格式
- 《Flash CS6動畫制作案例教程》教學(xué)課件 008
- 2024年限定區(qū)域房地產(chǎn)銷售代理協(xié)議
- 小孩帶到工廠免責(zé)協(xié)議書
- 2024年出租車承包服務(wù)協(xié)議
- 2024年化魚苗銷售協(xié)議模板
- 2024年度業(yè)務(wù)處理外包公司協(xié)議典范
- 二手車交易協(xié)議2024年樣式
- 2024酒店客房預(yù)訂及服務(wù)協(xié)議
- 零星維修工程施工組織設(shè)計
- 危險預(yù)知訓(xùn)練教材(KYT)
- ISO9001體系文件與IRIS標(biāo)準(zhǔn)條款對應(yīng)表
- 漢語教師志愿者培訓(xùn)大綱
- SPC培訓(xùn)資料_2
- 壓力表使用警示標(biāo)識
- 小學(xué)英語課堂教學(xué)策略與方法探討
- 2019年重慶普通高中會考通用技術(shù)真題及答案
- DB44 T 552-2008 林業(yè)生態(tài) 術(shù)語
- 天秤座小奏鳴曲,Libra Sonatine;迪安斯,Roland Dyens(古典吉他譜)
- 三國志11全人物信息(五維、特技、生卒年等)
評論
0/150
提交評論