




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1軟件體系結構
第8講:設計模式(一)江賀2內容簡介:設計模式概念設計模式的描述實例研究:文檔編輯器LexiLexi的文檔結構與組合(Composite)模式3設計模式概念ChristopherAlexander:“每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復的工作。”《設計模式:可復用面向對象軟件的基礎》:設計模式是“對被用來在特定場景下解決一般設計問題的類和相互通信的對象的描述”4設計模式概念設計模式的四個基本要素:模式名稱(PatternName):一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。問題(Problem):描述了應該在何時使用模式。解決方案(Solution)描述了設計的組成部分,它們之間的相互關系和各自的職責和協作方式。效果(Consequence)描述了模式應用的效果及使用模式應該權衡的問題。5設計模式概念6設計模式的描述模式名和分類模式名簡潔地描述了模式的本質。模式可以分為創建型、結構型、行為型。意圖是回答下列問題的簡單陳述:設計模式是做什么的?它的基本原理和意圖是什么?它解決的是什么樣的特定設計問題?別名模式的其他名稱。7設計模式的描述動機舉例說明一個設計問題以及如何用模式中的類、對象來解決該問題的特定情境。該情景會幫助你理解隨后對模式更抽象的描述。適用性在什么情況下可以使用該模式?該模式可以用來改進哪些不良設計?你怎樣識別這些情況?結構對模式中的類進行圖形描述,說明對象之間的請求序列和協作關系。8設計模式的描述參與者設計模式中的各個對象、類以及它們各自的職責。協作模式的參與者如何協作以實現它們的職責。效果模式怎樣支持它的目標?使用模式的效果和所需做的權衡取舍?系統結構的哪些方面可以獨立改變?9設計模式的描述實現實現模式時需要知道的一些提示、技術要點及應該避免的缺陷,以及是否存在某些特定于實現語言的問題。代碼示例用C++/Smalltalk實現該模式的代碼片段。已知應用實際應用系統中發現該模式的例子。相關模式10實例研究:文檔編輯器Lexi11實例研究:文檔編輯器LexiLexi設計中的7個問題文檔結構:文本的數據結構安排。所有的編輯、格式安排、顯示和文本分析都涉及到這樣的文檔結構。格式化:Lexi是如何來創建數據結構的?那些對象負責不同的格式化策略?修飾用戶界面:Lexi的用戶界面包括滾動條、邊界和用來修飾文檔界面的陰影。12實例研究:文檔編輯器Lexi支持多種視感標準(look-and-feel):Lexi應該不需做較大修改即可以適應不同的視感標準,如Motif支持多種窗口系統:不同視感標準通常是在不同的窗口系統上實現的。Lexi的設計應該盡可能獨立于窗口系統。用戶操作:用戶通過不同的界面操作Lexi,包括按鈕和下拉菜單。拼寫檢查和連字符:Lexi如何支持像拼寫檢查和決定連字符的連字點這樣的分析操作?當我們不得不增加一個新的分析操作時,如何盡量少修改相關類。13Lexi的文檔結構與組合(Composite)模式Lexi考慮的其實是如何來安排字符、線段、多邊形、圖像等的基本元素。用戶使用Lexi過程中,希望操作的既可以是單個字符、也可以是行、欄、表格、頁等。行、欄、表格、頁等都屬于子結構,而這些子結構又可以包含更小粒度的子結構。字符、線段等可以看作是不包含子結構的原子型結構。14Lexi的文檔結構與組合(Composite)模式字符、圖片、行、欄15Lexi的文檔結構與組合(Composite)模式字符、線段等原子型結構與一般子結構的關系欄行16字符、線段等原子型結構與一般子結構的動作基本一樣:Draw在屏幕上畫出自己Intersects判斷當前光標是否落在自己上面字符、線段等原子型結構與一般子結構的均可以從同一個基類繼承而來。Lexi的文檔結構與組合(Composite)模式17圖元18字符、線段等原子型結構與一般子結構的均從圖元繼承而來。其中,比如行、欄等類中包含了大量的成員變量,這些成員變量又是圖元的實例。字符、線段等原子型結構與一般子結構的這種關系,實際上就是一種組合(Composite)模式Lexi的文檔結構與組合(Composite)模式19組合(Composite)模式意圖將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得用戶對于單個對象和組合對象的使用具有一致性。Lexi的文檔結構與組合(Composite)模式20組合(Composite)模式動機在圖形編輯器和圖形捕獲系統這樣的應用程序中,用戶可以使用簡單的構件創建復雜的圖表。用戶可以組合多個簡單構件以形成一些較大的構件,而這些構件又可以組合成更大的構件。一種簡單實現方法是將不同粒度的構件用不同的類來定義,例如為字符、線等簡單圖元定義一些類,而為行、欄定義另外一些類作為簡單圖元的容器類。但是用戶在使用過程中可能將這些容器類的行為看成和簡單圖元類一樣!而Composite模式試圖解決這樣的問題,它描述了如何使用遞歸組合,使得用戶不必對這些類進行區別,如圖所示。 Lexi的文檔結構與組合(Composite)模式21抽象基類既要能夠反映原子圖元的特性,又要能夠反映一般子結構的特性2223組合(Composite)模式適用性在以下情況下使用Composite模式希望表示對象的部分-整體層次結構希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象
Lexi的文檔結構與組合(Composite)模式24Lexi的文檔結構與組合(Composite)模式組合(Composite)模式結構25Lexi的文檔結構與組合(Composite)模式26組合(Composite)模式參與者Component(Graphic)為組合中的對象聲明接口在適當的情況下,實現所有類共有接口的缺省行為聲明一個接口用于訪問和管理Component的子組件在遞歸結構中定義一個接口,用于訪問一個父組件,并在合適的情況下實現它Leaf(Rectangle,Line,Text等)在組合中表示葉節點對象,葉節點沒有子節點在組合中定義圖元對象的行為Composite(Picture)定義有子部件的那些部件的行為存儲子部件在Component接口中實現與子部件有關的操作。Client通過Component接口操縱組合部件的對象。Lexi的文檔結構與組合(Composite)模式27組合(Composite)模式協作用戶使用Component類接口與組合結構中的對象進行交互。如果接受者是一個葉節點,則直接處理請求。如果接受者是Composite,則它通常將請求發送給它的子部件,在轉發請求前/后可能執行一些輔助性操作。Lexi的文檔結構與組合(Composite)模式28組合(Composite)模式效果定義了包含基本對象和組合對象的類層次結構基本對象可以被組合成更復雜的組合對象,而這個組合對象又可以被組合。簡化客戶代碼客戶可以一致地使用組合結構和單個對象。通常客戶不知道也不關心處理的是一個葉節點還是一個組合組件。這就簡化了客戶代碼,因為在定義組合的那些類中不需要寫一些充斥著選擇語句的函數。使得更容易增加新類型的組件新定義的Composite或Leaf子類自動地與已有的結構和客戶代碼一起工作,客戶程序不需因新的Component類而改變。使你的設計變得更加一般化Lexi的文檔結構與組合(Composite)模式29組合(Composite)模式實現(需要考慮以下幾個問題)顯式的父部件引用共享組件最大化Component接口聲明管理子部件的操作Component是否應該實現一個Component列表子部件排序使用高速緩沖存儲改善性能應該由誰刪除Component存儲組件最好用哪一種數據結構Lexi的文檔結構與組合(Composite)模式30代碼示例計算機和立體聲組合音響這樣的設備經常被組裝成部分-整體層次結構或者是容器層次結構。例如,底盤可以包含驅動裝置和平面板,總線包含多個插件,機柜包括底盤、總線等。這種結構可以很自然地用Composite模式進行模擬。Lexi的文檔結構與組合(Composite)模式31代碼示例Equipment類為在部分-整體層次結構中的所有設備定義一個接口。classEquipment{public:virtual~Equipment();constchar*Name(){return_name;}virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();virtualvoidAdd(Equipment*);virtualvoidRemove(Equipment*);virtualIterator*CreateIterator();protected: Equipment(constchar*);private: constchar*_name;};
Lexi的文檔結構與組合(Composite)模式32代碼示例Equipment的子類包括表示磁盤驅動器、集成電路和開關的Leaf類:classFloppyDisk:publicEquipment{public: FloppyDisk(constchar*); virtual~FloppyDisk(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice();};
Lexi的文檔結構與組合(Composite)模式33代碼示例CompositeEquipment是包含其他設備的基類,它也是Equipment的子類。classCompositeEquipment:publicEquipment{public: virtual~CompositeEquipment(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice(); virtualvoidAdd(Equipment*); virtualvoidRemove(Equipment*); virtualIterator*CreateIterator();protected: CompositeEquipment(constchar*);private: List_equipment;};
Lexi的文檔結構與組合(Composite)模式34代碼示例NetPrice的缺省實現使用CreateIterator來累加子設備的實際價格。CurrencyCompositeEquipment::NetPrice(){Iterator*i=CreateIterator();Currencytotal=0;for(i->First();!i->IsDone();i->Next()){total+=i->CurrentItem()->NetPrice();}deletei;returntotal;}
Lexi的文檔結構與組合(Composite)模式35代碼示例計算機的底盤被表示為CompositeEquipment的子類Chassis.classChassis:publicCompositeEquipment{public:Chassis(constchar*);virtual~Chassis();virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();};
Lexi的文檔結構與組合(Composite)模式36代碼示例采取類似Chassis的方法來定義Cabinet和Bus.這樣就得到了組裝個人計算機所需的所有設備。Lexi的文檔結構與組合(Composite)模式EquipmentFloppyDiskCompositeEquipmentchildrenChassisCabine
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論