版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1溫故知新(wēngùzhīxīn)設(shè)計模式概念設(shè)計模式的描述實例研究:文檔編輯器LexiLexi的文檔結(jié)構(gòu)(jiégòu)與組合(Composite)模式共四十五頁2軟件體系結(jié)構(gòu)
第9講:設(shè)計模式(二)江賀共四十五頁3內(nèi)容簡介:Lexi的格式化與策略(cèlüè)(Strategy)模式Lexi的修飾用戶界面與修飾(Decorator)模式共四十五頁4Lexi的格式化與策略(cèlüè)(Strategy)模式Lexi的格式化:Lexi是如何來創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的?那些對象負責(zé)(fùzé)不同的格式化策略?欄行共四十五頁5Lexi的格式化與策略(cèlüè)(Strategy)模式在第9講里面,我們已經(jīng)按照組合模式設(shè)計存儲各種圖元的類。問題是如何把基本(jīběn)圖元劃分成為組合圖元。比如,一行里面包含多少個字符,包含哪些字符、圖像?圖元共四十五頁6Lexi的格式化與策略(cèlüè)(Strategy)模式這里(zhèlǐ),我們簡化考慮,只考慮如何把字符、圖像這樣的劃分成為行的操作;如何把行劃分成為欄,如何把欄劃分成為頁,與行的劃分基本思想相同。把字符、圖像這樣的基本圖元劃分成為行可以有不同的算法:速度最快、效果最差Simple速度中等、效果一般Array速度最慢、效果最好TeX共四十五頁7Lexi的格式化與策略(cèlüè)(Strategy)模式傳統(tǒng)實現(xiàn)方法:把這些不同的算法(suànfǎ)都放到圖元類中,作為圖元類的方法。優(yōu)點:封裝好,方法和屬性在一起。缺點:靈活性差,GlyphDraw()Insert(..)InterSects(..)Simple()Array()Tex()共四十五頁8Lexi的格式化與策略(cèlüè)(Strategy)模式策略(cèlüè)模式解決Lexi的格式化問題:考慮到以下因素:不同算法的接口基本一致不同算法的功能基本相同解決方案:把算法封裝到類中不同算法的基類相同,利用基類對外提供統(tǒng)一的接口共四十五頁9Lexi的格式化與策略(cèlüè)(Strategy)模式基類,封裝了各種(ɡèzhǒnɡ)算法的公共接口具體算法類共四十五頁10Lexi的格式化與策略(cèlüè)(Strategy)模式共四十五頁11Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式意圖定義(dìngyì)一系列的算法,把它們一個個封裝起來,并且使它們可以可以相互替換。本模式使得算法可以獨立于使用它的客戶而變化。別名政策(Policy)共四十五頁12Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式動機有許多算法可以對一個(yīɡè)文本流進行分行。將這些算法硬性地放入到使用它們的類中是不可取的:需要換行功能的客戶程序如果直接包含換行算法代碼,自身將變得更加復(fù)雜,使得客戶程序龐大而難以維護,特別是在需要支持多種換行算法的時候不同的時候需要不同的算法,我們不想支持并不使用的那些換行算法當(dāng)換行算法是客戶程序的一部分時,增加新的換行算法或改變現(xiàn)有算法將十分困難共四十五頁13Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式動機為了解決這些困難(kùnnɑn),可以定義一些類來封裝不同的換行算法。一種以這種方法封裝的算法稱為一個策略(strategy)共四十五頁14Lexi的格式化與策略(cèlüè)(Strategy)模式策略(cèlüè)模式代碼示例Composition代碼:classComposition{ public: Composition(Compositor*);voidRepair();private:
Compositor*_compositor;Component*_components;//thelistofcomponentsint_componentCount;//thenumberofcomponentsint_lineWidth;//theComposition'slinewidthint*_lineBreaks;//thepositionoflinebreaksincomponentsint_lineCount;//thenumberoflines};
共四十五頁15Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式(móshì)代碼示例Compositor代碼:classCompositor{ public: virtualintCompose(Coordnatural[],Coordstretch[], Coordshrink[],intcomponentCount, intlineWidth,intbreaks[])=0; protected:Compositor();};
共四十五頁16Lexi的格式化與策略(cèlüè)(Strategy)模式策略(cèlüè)模式代碼示例Compositon類的repair函數(shù)代碼:voidComposition::Repair(){Coord*natural;Coord*stretchability;Coord*shrinkability;intcomponentCount;int*breaks;//preparethearrayswiththedesiredcomponentsizes//...//determinewherethebreaksare:intbreakCount;breakCount=_compositor->Compose(natural,stretchability,shrinkability,componentCount,_lineWidth,breaks);//layoutcomponentsaccordingtobreaks//...}
共四十五頁17Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式代碼(dàimǎ)示例SimpleCompositor類的代碼:classSimpleCompositor:publicCompositor{public:SimpleCompositor();virtualintCompose(Coordnatural[],Coordstretch[],Coordshrink[],intcomponentCount,intlineWidth,intbreaks[]);//...};
共四十五頁18Lexi的格式化與策略(cèlüè)(Strategy)模式策略(cèlüè)模式代碼示例TeXCompositor類的代碼:classTeXCompositor:publicCompositor{ public:TeXCompositor(); virtualintCompose(Coordnatural[],Coordstretch[],Coord shrink[],intcomponentCount,intlineWidth,intbreaks[]); //... };
共四十五頁19Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式代碼(dàimǎ)示例ArrayCompositor類的代碼:classArrayCompositor:publicCompositor{ public:ArrayCompositor(intinterval); virtualintCompose(Coordnatural[],Coordstretch[],Coord shrink[],intcomponentCount,intlineWidth,intbreaks[]); //... };
共四十五頁20Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式(móshì)代碼示例Composition*quick=newComposition(newSimpleCompositor);Composition*slick=newComposition(newTeXCompositor);Composition*iconic=newComposition(newArrayCompositor(100));
共四十五頁21Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式適用性許多相關(guān)類僅僅是行為有異。需要使用一個算法的不同變體。算法使用客戶不應(yīng)該知道的數(shù)據(jù)。一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件(tiáojiàn)語句的形式出現(xiàn)。將相關(guān)的條件(tiáojiàn)分支移入它們各自的Strategy類中以代替這些條件語句。共四十五頁22Lexi的格式化與策略(cèlüè)(Strategy)模式策略(cèlüè)模式結(jié)構(gòu)共四十五頁23Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式參與者Strategy(策略,如Compositor)定義所有支持的算法的公共接口。Context使用(shǐyòng)這個接口來調(diào)用某個ConcreteStrategy定義的算法。ConcreteStrategy(具體策略,如SimpleCompositor,TeXCompositor等)以Strategy接口實現(xiàn)某個具體算法Context(上下文,如Composition)用一個ConcreteStrategy對象來配置維護一個對Strategy對象的引用可以定一個接口,允許Strategy訪問它的數(shù)據(jù)共四十五頁24Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式協(xié)作Strategy和Context相互作用以實現(xiàn)選定的算法。當(dāng)算法被調(diào)用時,Context可以將該算法所需要的所有數(shù)據(jù)(shùjù)都傳遞給該Strategy?;蛘?,Context可以將自身作為一個參數(shù)傳遞給Strategy操作。Context將它的客戶請求轉(zhuǎn)發(fā)給它的Strategy??蛻敉ǔ?chuàng)建并傳遞一個ConcreteStrategy對象給該Context;這樣,客戶僅僅與Context交互。通常,有一系列的ConcreteStrategy類可以供客戶從中選擇。共四十五頁25Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式效果相關(guān)算法(suànfǎ)系列Strategy類層次為Context定義了一系列可供重用的算法或行為。消除了一些條件語句不用Strategy,Context中正文換行可能使用如下代碼voidComposition::Repair(){switch(_breakingStrategy){caseSimpleStrategy:ComposeWithSimpleCompositor();break;caseTeXStrategy:ComposeWithTeXCompositor();break;//...}}voidComposition::Repair(){_compositor->Compose();}共四十五頁26Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式效果實現(xiàn)的選擇Strategy模式提供了相同行為(xíngwéi)的不同實現(xiàn)??蛻艨梢愿鶕?jù)不同時間/空間權(quán)衡取舍要求從不同策略中進行選擇??蛻舯仨毩私獠煌腟trategyStrategy和Context之間的通信開銷增加了對象和類的數(shù)目共四十五頁27Lexi的格式化與策略(cèlüè)(Strategy)模式策略模式實現(xiàn)定義Strategy和Context接口,Strategy和Context接口必須(bìxū)使得ConcreteStrategy能夠有效地訪問它所需要的Context中的任何數(shù)據(jù),反之亦然。一種方法是讓Context將數(shù)據(jù)放在參數(shù)中傳遞給Strategy,另外一種方法是將Context自身(引用)作為一個參數(shù)傳遞給Strategy.共四十五頁28Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式修飾(xiūshì)用戶界面:Lexi的用戶界面包括滾動條、邊界。共四十五頁29Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式傳統(tǒng)做法:為Composition類創(chuàng)建(chuàngjiàn)一個子類BorderedCompositon,用來給Composition添加邊界;創(chuàng)建ScrollableComposition來增加滾動條;創(chuàng)建BorderedScrollableComposition來支持滾動條和邊界。
隨著界面的增加,導(dǎo)致類爆炸共四十五頁30Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式修飾模式解決修飾用戶界面(yònɡhùjièmiàn)問題:考慮到以下因素:Scrollbar和Border的主要動作是draw,也就是接口基本一樣解決方案:Scrollbar和Border繼承同樣一個基類MonoGlyph,MonoGlyph繼承Glyph,同時包含成員變量,該成員變量是MonoGlyph除自身外還要繪制的對象。例如,Border類除了繪制一個邊界,它還負責(zé)繪制文本頁。這樣就形成了邊界包圍在文本之外的效果,文本的繪制由Border類調(diào)用文本對應(yīng)的組合對象的相應(yīng)方法來實現(xiàn)。共四十五頁31Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式voidMonoGlyph::Draw(Window*w){_component->Draw(w);}voidBorder::Draw(Window*w){MonoGlyph::Draw(w);DrawBorder(w);}共四十五頁32border中有一個(yīɡè)成員變量scrollbar,border的繪制時調(diào)用scrollbar的繪制方法scrollbar中有一個成員(chéngyuán)變量composition,scrollbar的繪制時調(diào)用compositon的繪制方法共四十五頁33Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式修飾模式意圖(yìtú)動態(tài)地給一個對象添加一些額外的操作,就增加功能來說,Decorator模式相比生成子類更為靈活。別名包裝器Wrapper共四十五頁34Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式修飾模式動機類似(lèisì)于Lexi中給文本添加用戶界面共四十五頁35Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式修飾模式(móshì)動機共四十五頁36Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式修飾模式代碼(dàimǎ)示例VisualComponent類:classVisualComponent{ public:VisualComponent(); virtualvoidDraw(); virtualvoidResize(); //...};
共四十五頁37Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式修飾模式(móshì)代碼示例Decorator類:classDecorator:publicVisualComponent{ public:Decorator(VisualComponent*); virtualvoidDraw(); virtualvoidResize(); //... private: VisualComponent*_component; };
共四十五頁38Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式修飾模式代碼(dàimǎ)示例Decorator類中Draw和Resize的實現(xiàn):voidDecorator::Draw(){ _component->Draw(); } voidDecorator::Resize(){ _component->Resize(); }
共四十五頁39Lexi的修飾用戶界面(yònɡhùjièmiàn)與修飾(Decorator)模式修飾模式(móshì)代碼示例BorderDecorator類及Draw的實現(xiàn):classBorderDecorator:publicDecorator{ public: BorderDecorator(VisualComponent*,intborderWidth); virtualvoidDraw(); private: voidDrawBorder(int); private: int_width; }; voidBorderDecorator::Draw(){ Decorator::Draw(); DrawBorder(_width); }
共四十五頁40Lexi的修飾(xiūshì)用戶界面與修飾(xiūshì)(Decorator)模式修飾模式代碼示例如何使用D
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GH/T 1448-2024雅安藏茶原料要求
- 2024屆內(nèi)蒙古自治區(qū)錫林郭勒盟高三上學(xué)期期末考試歷史試題(解析版)
- 2024-2025學(xué)年浙江省杭州地區(qū)(含周邊)重點中學(xué)高二上學(xué)期期中考試歷史試題(解析版)
- 廣東省廣州市天河區(qū)2025屆高三上學(xué)期綜合測試(一)英語試卷含答案
- 《美術(shù)基本種類》課件
- 單位管理制度集合大合集【人員管理】十篇
- 單位管理制度匯編大合集【人力資源管理篇】十篇
- 單位管理制度合并匯編人員管理
- 單位管理制度分享匯編【職員管理】十篇
- 高中語文一些重要的文化常識
- 數(shù)據(jù)中心電力設(shè)備調(diào)試方案
- 2024年度國際物流運輸合同3篇
- 新入職員工年終工作總結(jié)課件
- 中華傳統(tǒng)文化之文學(xué)瑰寶學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 靜脈導(dǎo)管維護
- 年度先進員工選票標準格式
- 滿堂支架計算
- MA5680T開局配置
- 螺桿式風(fēng)冷冷水(熱泵)機組電路圖
- CFG樁施工記錄表范本
- 《錄音技術(shù)與藝術(shù)》課程教學(xué)大綱(新版)(共11頁)
評論
0/150
提交評論