




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+設(shè)計(jì)模式教程第七講:UIPPaint設(shè)計(jì)模式(實(shí)現(xiàn)篇) (中間者、門面、狀態(tài)、命令、訪問者、職責(zé)鏈設(shè)計(jì)模式)主講人:步磊峰 UIPower 3D界面引擎負(fù)責(zé)人第一節(jié):整體架構(gòu)UML圖2 第一節(jié):整體架構(gòu)UML圖3 第一節(jié):整體架構(gòu)UML圖4 第二節(jié):實(shí)現(xiàn):訪問者模式5意圖: 表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中各個(gè)元素的操作。它使你可以在不改變各個(gè)元素的類的前提下定義作用于這些元素的 新操作。 用途: 1、一個(gè)對(duì)象結(jié)構(gòu)包含很多類,他們有不同接口,而你想對(duì)這些對(duì)象實(shí)施一些依賴于其具體類的操作。 2、定義對(duì)象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。改變對(duì)象結(jié)構(gòu)類需要重新定義對(duì)所有訪問者 的接
2、口,這可能需要很大代價(jià)。如果對(duì)象結(jié)構(gòu)類經(jīng)常改變,那么還是在該對(duì)象結(jié)構(gòu)類中定義相關(guān)操作較好。 第二節(jié):實(shí)現(xiàn):訪問者模式6根據(jù)需求: 我們會(huì)發(fā)現(xiàn)當(dāng)處于CRectState時(shí)候,鼠標(biāo)點(diǎn)擊PaintArea時(shí),需要?jiǎng)?chuàng)建一個(gè)以鼠標(biāo)點(diǎn)擊處為中心點(diǎn)的形狀。 因此我們需要形狀(或者叫圖元) 目前支持三種圖元 : CRectShape,CCircleShape,CTriangleShape,他們都繼承自CShapeBase類,每種圖元都能 被點(diǎn)中并且被填充,因此需要支持鼠標(biāo)碰檢事件。 所有的圖元我們需要使用CShapManager來進(jìn)行管理。 第二節(jié):實(shí)現(xiàn):訪問者模式7 圖元的繪制有兩種方式: 1、在每個(gè)CSh
3、apeBase中定義一個(gè)虛函數(shù)Render(),每個(gè)子類都o(jì)verride Render函數(shù),實(shí)現(xiàn)繪制代碼,這意味著 所有的繪制代碼都分散在每個(gè)實(shí)際的子類中。 2、 我們使用訪問者模式,所有的實(shí)際子類的繪制代碼全部放在CDrawerVisitor類中,如果要修改或增加功能,只要 修改CDrawerVisitor類就可以了。我們使用該方式實(shí)現(xiàn)圖元的渲染。 CShapeBase中有一個(gè)純虛函數(shù): 第三節(jié):實(shí)現(xiàn):狀態(tài)模式8意圖: 允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變他的行為。用途: 1、 一個(gè)對(duì)象的行為取決于他的狀態(tài),并且他必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變行為。 2、 一個(gè)操作中含有龐大的多分支的條件語句。這
4、個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常多個(gè)操作包含這一 相同的條件結(jié)構(gòu) 。State模式將每個(gè)條件分支放入一個(gè)獨(dú)立的類中。這使得你可以根據(jù)對(duì)象的自身情況將對(duì)象 的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化。 第三節(jié):實(shí)現(xiàn):狀態(tài)模式9根據(jù)需求: 當(dāng)我們鼠標(biāo)點(diǎn)中某個(gè)IconButton時(shí),會(huì)觸發(fā)Selected為true的事件,或許我們可以直接監(jiān)聽該事件作出要繪制哪 個(gè)類型的Shape的行為,但是這種方式使Shape和控件系統(tǒng)緊密耦合。我們換種思路。 我們會(huì)發(fā)現(xiàn)當(dāng)選中某一個(gè)按鈕時(shí),每個(gè)按鈕所做的事情不一樣,也就是說圖形編輯器的狀態(tài)會(huì)影響程序要執(zhí)行的 動(dòng)作。這種情況特別適合使用狀態(tài)模
5、式進(jìn)行設(shè)計(jì)。因此我們引進(jìn)一個(gè)中間層,讓IconButton的狀態(tài)切換與狀態(tài)機(jī) 進(jìn)行交互。使用狀態(tài)模式我們能夠顯著的消除掉if/else或switch/case語句的使用。 上述分析后,我們會(huì)發(fā)現(xiàn),每一個(gè)IconButton對(duì)應(yīng)一個(gè)狀態(tài),例如RectButton選中時(shí),對(duì)應(yīng)的是CRectState。 CircleButton選中時(shí),切換到CCircleState。因此我們只要監(jiān)聽IconButton的Selected事件,在事件響應(yīng)函數(shù) 中進(jìn)行狀態(tài)的切換。那么由誰來進(jìn)行狀態(tài)切換呢? 狀態(tài)設(shè)計(jì)模式涉及到兩個(gè)層次,第一層次是CStateManager類負(fù)責(zé)所有狀態(tài)管理,其持有一個(gè)CurrentSta
6、te的指 針,用于指向當(dāng)前的狀態(tài)。當(dāng)CStateManager設(shè)置狀態(tài)時(shí),最好能夠發(fā)送狀態(tài)發(fā)生改變的消息,并且 CurrentState針指向剛設(shè)置的狀態(tài)。因此由CStateManager來進(jìn)行狀態(tài)切換是非常合適的。 第三節(jié):實(shí)現(xiàn):狀態(tài)模式10 第二個(gè)層次是CStateBase以及所有的子類。 第三節(jié):實(shí)現(xiàn):狀態(tài)模式11 那么StateBase需要哪些操作呢? 根據(jù)需求:我們會(huì)發(fā)現(xiàn)當(dāng)處于CRectState時(shí)候,鼠標(biāo)點(diǎn)擊PaintArea時(shí),需要?jiǎng)?chuàng)建一個(gè)以鼠標(biāo)點(diǎn)擊處為中心點(diǎn)的 Rect形狀。而其他例如處于CCircleState,CTriangleState狀態(tài)時(shí),表現(xiàn)形式與CRectStat
7、e相同,唯一 區(qū)別就是產(chǎn)生的形狀不同而已。 當(dāng)處于CFillState時(shí),點(diǎn)擊PaintArea控件中任意存在的形狀,都會(huì)填充點(diǎn)中的圖形。 因此我們會(huì)發(fā)現(xiàn)都是PaintArea鼠標(biāo)點(diǎn)擊有關(guān),因此最起碼StateBase中需要一個(gè)虛函數(shù)例如: virtual void MouseDown(const Point& pt)的函數(shù)。 為了更加靈活的處理切換狀態(tài),例如有一種需求,假設(shè)當(dāng)我們選中繪制圖像狀態(tài)時(shí)使用正常的鼠標(biāo)指 針,而在選中CFillState時(shí),要使用一個(gè)油漆桶鼠標(biāo)指針,這時(shí)候就需要我們能夠響應(yīng)狀態(tài)切換的消息。 因此再增加兩個(gè)狀態(tài)切換的虛函數(shù): virtual void OnEnter(
8、) /進(jìn)入當(dāng)前狀態(tài)我們應(yīng)該要做什么事情呢? virtual void OnLeave() /離開當(dāng)前狀態(tài)我們應(yīng)該要做什么事情呢? 第四節(jié):實(shí)現(xiàn):命令模式12意圖: 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化; 對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以支持可撤銷的操作。用途: 1、接口回調(diào)。Command模式是回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲贰?2、在不同時(shí)刻指定,排列和執(zhí)行請(qǐng)求。 3、支持Undo/Redo操作。 4、支持修改日志。 5、 支持事務(wù)操作。 第四節(jié):實(shí)現(xiàn):命令模式13根據(jù)需求: 我們會(huì)發(fā)現(xiàn)當(dāng)處于CRectState時(shí)候,鼠標(biāo)點(diǎn)擊PaintArea時(shí),需要?jiǎng)?chuàng)建一個(gè)以鼠標(biāo)點(diǎn)
9、擊處為中心點(diǎn)的形狀。 并且支持形狀的創(chuàng)建和撤銷操作,意味著我們支持形狀創(chuàng)建的Undo/Redo功能。 我們定義ICommand接口用于支持Undo/Redo功能。該接口具有Execute()接口函數(shù)支持Redo操作,Undo()接口函 數(shù)用于支持Undo功能。 CShapeCreateCommand實(shí)現(xiàn)了ICommand接口,用于支持形狀的創(chuàng)建和撤銷。該命令是在: StateBase:MouseDown時(shí)被添加到CUndoManager中進(jìn)行管理的。 CUndoManager類用于管理所有的命令對(duì)象,需要支持三個(gè)功能: 1、 命令的添加 2、 Undo棧和Redo棧的交互 3、 記錄從當(dāng)前開始
10、往前N個(gè)命令(N代表最多可以Undo/Redo多少步) 第五節(jié):實(shí)現(xiàn):中間者模式14意圖: 用一個(gè)中介對(duì)象來封裝一系列交互。中間者使個(gè)對(duì)象不需要顯式的相互引用,從而使其耦合松散,而且可以獨(dú)立的 改變他們之間的交互。 用途: 1、一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通訊。產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。 2、一個(gè)對(duì)象引用其他很多對(duì)象并且直接與這些對(duì)象通信,導(dǎo)致難以復(fù)用該對(duì)象。 3、想定制一個(gè)分布在多個(gè)類中的行為,而又不想生成太多的子類。 第五節(jié):實(shí)現(xiàn):中間者模式15 前面已經(jīng)將涉及到應(yīng)用程序交互的類都定義出來了,那么他們之間如何協(xié)作呢? 比較清晰的方式是劃分模塊: UIPaint模塊-中間
11、者類-UIPLib模塊。 中間者類知道所有的UIPaint模塊的對(duì)象,而UIPaint模塊的對(duì)象,例如每一個(gè)StateBase的子類都能夠查找到中間者類。 中間者類監(jiān)聽UIPLib中的控件的所有輸入事件,例如監(jiān)聽CIconButton的Select事件,根據(jù)哪個(gè)CIconButton被選中, 作出響應(yīng)的狀態(tài)切換(調(diào)用中間者類所擁有的StateManager,然后調(diào)用StateManager的SetCurrentState函數(shù)使?fàn)顟B(tài) 發(fā)生切換) 所有的輸出也通過中間者類進(jìn)行,監(jiān)聽CPaintArea類的RenderEvent,將所有UIPPaint中的圖元渲染到CPaintArea控 件上。 第
12、六節(jié):實(shí)現(xiàn):門面模式16意圖: 為子系統(tǒng)的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得子系統(tǒng)更加容易使用。 用途: 1、當(dāng)你要為一個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)簡單的接口。Facade可以提供一個(gè)簡單的缺省的視圖,這一視圖對(duì)大多數(shù) 用戶來說已經(jīng)足夠了,而那些需要更多定制特性的用戶可以越過Facade層。 2、客戶程序與抽象類的實(shí)現(xiàn)部分之間存在很大依賴性。引入Facade將這個(gè)子系統(tǒng)與客戶以及其他的子系統(tǒng)進(jìn)行分 離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。 3、當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),你可以使用Facade模式定義子系統(tǒng)的每層的入口點(diǎn)。如果子系統(tǒng)之間 相互依賴,你可
13、以讓他們通過Facade進(jìn)行通訊,從而簡化了他們之間的依賴性。 第六節(jié):實(shí)現(xiàn):門面模式17 需求分析: 我們會(huì)發(fā)現(xiàn)中間者M(jìn)ediator作為中心的周轉(zhuǎn)站,其他的協(xié)作類都是通過中間者進(jìn)行通信,因此中間者模式是一種行為模式。 中間者中引用了所有協(xié)作類,或者子模塊(UndoRedo模塊,狀態(tài)機(jī)模塊,輸入輸出模塊,圖元顯示模塊),因此導(dǎo)致子模塊眾多。使用者需要了解各個(gè)模塊之間的協(xié)作關(guān)系。 我們讓中間者又充當(dāng)門面的角色(CFacadeMediator),讓一系列復(fù)雜的類包裝成一個(gè)簡單的封閉接口。 這意味著所有的重要功能都通過CFacadeMediator類來進(jìn)行操作,不要使用子模塊的接口函數(shù),而是將子模
14、塊的接口函數(shù)都封裝在CFacadeMediator類中,這樣即使再多再復(fù)雜的子模塊,我們都把他們隱藏起來,你不需要調(diào)用子模塊的相關(guān)函數(shù),而是調(diào)用CFacadeMediator中的封裝的相關(guān)接口函數(shù)。這樣就避免了過多類協(xié)作,使用起來很復(fù)雜的狀況。 由此可見,門面模式是一種結(jié)構(gòu)模式,將系統(tǒng)中的復(fù)雜的類協(xié)作關(guān)系扁平化。 第六節(jié):實(shí)現(xiàn):門面模式18 第七節(jié):實(shí)現(xiàn):職責(zé)鏈模式19意圖: 使多個(gè)對(duì)象有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這 條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。 用途: 1、有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)
15、確定。 2、你想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。 3、可以處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)該被動(dòng)態(tài)指定。第七節(jié):實(shí)現(xiàn):職責(zé)鏈模式20 需求分析: 當(dāng)我們按下F1鍵時(shí),當(dāng)前獲得焦點(diǎn)的控件會(huì)接受到F1鍵盤事件,彈出一個(gè)MsgBox對(duì)話框,顯示當(dāng)前控件的用途幫助信息。 最簡單的方法是監(jiān)聽每個(gè)控件的F1鍵盤事件,作出響應(yīng)。但是代碼分散到了各個(gè)控件的事件響應(yīng)實(shí)現(xiàn)中。而且如果我們要調(diào)整某些控件不提供幫助,而有些提供,意味著幫助系統(tǒng)是可配置的。在這種情況下,我們需要更靈活的機(jī)制。而職責(zé)鏈特別適合這種情形。CControlHelpChain代表一個(gè)職責(zé)鏈,通過next指針形成鏈表。每一個(gè)CControl HelpChain有一個(gè)指針指向CControlBase。CControlHelpChain有一個(gè)靜態(tài)的成員函數(shù)用于監(jiān)聽CControlBase的F1鍵盤事件,在CControlHelpChain的構(gòu)造函數(shù)中,將該靜態(tài)成員監(jiān)聽函數(shù)注冊(cè)到其所指向的CControlBase中。 使用靜態(tài)成
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加強(qiáng)倉庫節(jié)能減排措施的行動(dòng)方案計(jì)劃
- 交通樞紐安全管理辦法計(jì)劃
- 班級(jí)親子活動(dòng)的組織與方案設(shè)計(jì)計(jì)劃
- 化工行業(yè)品牌宣傳方案計(jì)劃
- 高中信息技術(shù) 信息價(jià)值的判斷教學(xué)實(shí)錄2 滬教版必修1
- 《托里縣上海梅蘭日蘭礦業(yè)有限公司新疆托里縣科克火熱金礦Ⅱ號(hào)礦段礦產(chǎn)資源開發(fā)利用與生態(tài)保護(hù)修復(fù)方案》專家意見的認(rèn)定
- 七年級(jí)地理下冊(cè) 9.3 撒哈拉以南的非洲-黑種人的故鄉(xiāng)教學(xué)實(shí)錄 晉教版
- 化妝師職業(yè)知識(shí)培訓(xùn)課件
- 統(tǒng)編版小學(xué)語文二年級(jí)下冊(cè)《語文園地八》精美課件
- 2025年江蘇貨運(yùn)資格證答題竅門
- 南充市高2025屆高三高考適應(yīng)性考試(二診)生物試卷(含答案)
- 2025年雙方共同離婚協(xié)議書樣本
- 2025年鐘山職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫往年題考
- 2025版七年級(jí)下冊(cè)歷史必背知識(shí)點(diǎn)
- TSG21-2025固定式壓力容器安全技術(shù)(送審稿)
- DBJ50-052-2020公共建筑節(jié)能(綠色建筑)設(shè)計(jì)標(biāo)準(zhǔn)
- 《苗圃生產(chǎn)與管理》教案-第一章 園林苗圃的建立
- 2025年眼藥水項(xiàng)目投資分析及可行性報(bào)告
- 2025年內(nèi)蒙古自治區(qū)政府工作報(bào)告測(cè)試題及參考答案
- 2024年全國中學(xué)生生物學(xué)聯(lián)賽試題及答案詳解
- 《中藥注射劑大全》課件
評(píng)論
0/150
提交評(píng)論