chp8-設(shè)計模式導(dǎo)論_第1頁
chp8-設(shè)計模式導(dǎo)論_第2頁
chp8-設(shè)計模式導(dǎo)論_第3頁
chp8-設(shè)計模式導(dǎo)論_第4頁
chp8-設(shè)計模式導(dǎo)論_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、電子科技大學(xué)電子科技大學(xué) 計算機學(xué)院計算機學(xué)院. .軟件學(xué)院軟件學(xué)院1TP-52nChristopher Alexander教授的教授的“三步曲三步曲”q研究模式的理論研究模式的理論建筑的永恒之道建筑的永恒之道q第一個完整的模式語言第一個完整的模式語言建筑模式語言建筑模式語言q理性地用模式來指導(dǎo)建筑過程理性地用模式來指導(dǎo)建筑過程俄勒岡實俄勒岡實驗驗2TP-52簡單地說,模式是一個出現(xiàn)在世界上的實物,簡單地說,模式是一個出現(xiàn)在世界上的實物,同時也是一條規(guī)則,告訴你應(yīng)該如何創(chuàng)建一個同時也是一條規(guī)則,告訴你應(yīng)該如何創(chuàng)建一個實物、應(yīng)該在何時創(chuàng)建。它既是過程,也是實實物、應(yīng)該在何時創(chuàng)建。它既是過程,也是

2、實物;既是對當(dāng)前實物的描述,也是對創(chuàng)建實物物;既是對當(dāng)前實物的描述,也是對創(chuàng)建實物的過程的描述。的過程的描述。C.AlexanderC.Alexander,建筑的永恒之道建筑的永恒之道3TP-52n建筑設(shè)計師建筑設(shè)計師Christopher Alexander:n“每一個模式描述了一個在我們周圍不每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動。地使用該方案而不必做重復(fù)勞動?!?TP-52n人們在自己的環(huán)境中不斷發(fā)現(xiàn)問題和找尋問題人們在自己的環(huán)境中

3、不斷發(fā)現(xiàn)問題和找尋問題的解決方案的時候,發(fā)現(xiàn)有一些問題及其解決的解決方案的時候,發(fā)現(xiàn)有一些問題及其解決方案不斷變換面孔重復(fù)出現(xiàn),在這些不同的面方案不斷變換面孔重復(fù)出現(xiàn),在這些不同的面孔后面是共同的本質(zhì);這就是模式??缀竺媸枪餐谋举|(zhì);這就是模式。 n模式是一種問題的解決思路,它為經(jīng)常出現(xiàn)的模式是一種問題的解決思路,它為經(jīng)常出現(xiàn)的問題提供了通用可靠的解決方案,適用于多種問題提供了通用可靠的解決方案,適用于多種領(lǐng)域環(huán)境。領(lǐng)域環(huán)境。n模式同時也是一種表達(dá)式框架。模式同時也是一種表達(dá)式框架。5TP-52n模式所描述的問題及問題的答案都應(yīng)當(dāng)是具有模式所描述的問題及問題的答案都應(yīng)當(dāng)是具有代表性的問題和問題

4、的答案代表性的問題和問題的答案n代表性代表性以不同的形式重復(fù)出現(xiàn),允許使用以不同的形式重復(fù)出現(xiàn),允許使用者舉一反三,將它應(yīng)用到不同的環(huán)境中去。者舉一反三,將它應(yīng)用到不同的環(huán)境中去。n為了與其他人交流,通常還要求給這個問題和為了與其他人交流,通常還要求給這個問題和問題的答案一個名字問題的答案一個名字6TP-52n1987年年Ward Cunningham和和Kent Beck使用使用Alexander的理論發(fā)展出一個有五個模式的語言來指導(dǎo)的理論發(fā)展出一個有五個模式的語言來指導(dǎo)Smalltalk開發(fā)開發(fā)nJim Coplien搜集搜集C+語言的成例語言的成例(idioms),成例是,成例是模式的一

5、種模式的一種n從從1990到到1992年,年,GOF的成員開始他們搜集模式的成員開始他們搜集模式的工作的工作n1993年年8月,月,Kent Beck和和Grady Booch主持了第主持了第一次關(guān)于模式的會議一次關(guān)于模式的會議n模式化方法研究的開創(chuàng)性著作模式化方法研究的開創(chuàng)性著作Design Patterns7TP-528TP-52n重用重用(reuse):是目標(biāo)是目標(biāo)q兩種重要的重用手段兩種重要的重用手段nInheritance & compositionn接口與實現(xiàn)分離接口與實現(xiàn)分離q接口保持不變,分離帶來靈活性接口保持不變,分離帶來靈活性q多態(tài)性多態(tài)性(polymorphism)nDe

6、coupleq降低復(fù)雜性降低復(fù)雜性9TP-52n 模式名稱(模式名稱(pattern name) 一個助記名,它用一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。一兩個詞來描述模式的問題、解決方案和效果。n問題問題(problem) 描述了應(yīng)該在何時使用模式。描述了應(yīng)該在何時使用模式。它解釋了設(shè)計問題和問題存在的前因后果。它解釋了設(shè)計問題和問題存在的前因后果。n解決方案解決方案(solution) 描述了設(shè)計的組成成分,描述了設(shè)計的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。n效果效果(consequences) 軟件效果大多關(guān)注對時

7、間軟件效果大多關(guān)注對時間和空間的衡量,它們也表述了語言和實現(xiàn)問題和空間的衡量,它們也表述了語言和實現(xiàn)問題10TP-52n針對問題域不同:設(shè)計模式針對面向?qū)ο蟮膯栣槍栴}域不同:設(shè)計模式針對面向?qū)ο蟮膯栴}域;框架針對特定業(yè)務(wù)的問題域;題域;框架針對特定業(yè)務(wù)的問題域; n設(shè)計模式比框架更為抽象:設(shè)計模式在碰到具設(shè)計模式比框架更為抽象:設(shè)計模式在碰到具體問題后,才能產(chǎn)生代碼;框架已經(jīng)可以用代體問題后,才能產(chǎn)生代碼;框架已經(jīng)可以用代碼表示。碼表示。 n設(shè)計模式是比框架更小的體系結(jié)構(gòu)元素:設(shè)計模式是比框架更小的體系結(jié)構(gòu)元素: 框框架中可以包括多個設(shè)計模式。架中可以包括多個設(shè)計模式。 11TP-52n盡力

8、用一種標(biāo)準(zhǔn)的方式描述設(shè)計經(jīng)驗盡力用一種標(biāo)準(zhǔn)的方式描述設(shè)計經(jīng)驗n為設(shè)計者提供一種通用的語言為設(shè)計者提供一種通用的語言n增加復(fù)用性,減少設(shè)計的多樣性增加復(fù)用性,減少設(shè)計的多樣性n增強設(shè)計變更的靈活性增強設(shè)計變更的靈活性n提高設(shè)計文檔的質(zhì)量提高設(shè)計文檔的質(zhì)量n增強設(shè)計的可理解性增強設(shè)計的可理解性12TP-52nDesign Patterns: Elements of Reusable Object-Oriented Software(Addison-Wesley,1995) n由由 Erich Gamma、Richard Helm、Ralph Johnson 和和 John Vlissides 合著

9、合著-四人幫?四人幫?n對軟件設(shè)計模式的研究造就了一本可能是面向?qū)浖O(shè)計模式的研究造就了一本可能是面向?qū)ο笤O(shè)計方面最有影響的書籍對象設(shè)計方面最有影響的書籍 13TP-52RequirementsAnalysisDesignImplementationArchitectureFrameworkDetailed DesignxKey:= secondary emphasisx = main emphasis14TP-52n廚房現(xiàn)代化廚房現(xiàn)代化n設(shè)計一個設(shè)計一個KitchenViewer軟件軟件n用戶可以自己布局廚房用戶可以自己布局廚房n不必拘泥于某一種形式不必拘泥于某一種形式15TP-52n用戶

10、單擊用戶單擊“壁柜壁柜”圖標(biāo)圖標(biāo)n程序在工作區(qū)中央顯示一個壁柜程序在工作區(qū)中央顯示一個壁柜n用戶調(diào)整壁柜大小用戶調(diào)整壁柜大小n拖動壁柜到指定位置拖動壁柜到指定位置n釋放光標(biāo)釋放光標(biāo)n應(yīng)用程序定位壁柜位置(最近確定的位置)應(yīng)用程序定位壁柜位置(最近確定的位置)n用戶單擊用戶單擊“立柜立柜”圖標(biāo)圖標(biāo)n程序在工作區(qū)中央顯示一個程序在工作區(qū)中央顯示一個“立柜立柜”n16TP-52壁柜壁柜臺面臺面地柜地柜現(xiàn)代現(xiàn)代古典古典古董古董工藝工藝menudisplay areastyles17TP-52 ModernClassicAntiqueArts & CraftsWall cabinetsFloor cab

11、inetsCountertop18TP-52 ModernClassicAntiqueArts & Crafts19TP-52nKitchenViewer的具體設(shè)計目標(biāo)是什么?的具體設(shè)計目標(biāo)是什么?nSolutions:q不管風(fēng)格如何,繪制過程不應(yīng)多次重復(fù)不管風(fēng)格如何,繪制過程不應(yīng)多次重復(fù)q是否可提供如是否可提供如renderKitchen(myStyle)方法方法q通過參數(shù)控制繪制過程通過參數(shù)控制繪制過程q因此,因此,q應(yīng)用程序在運行時必須構(gòu)造一個對象族:這個設(shè)計應(yīng)用程序在運行時必須構(gòu)造一個對象族:這個設(shè)計必須能夠在幾種風(fēng)格中選擇!必須能夠在幾種風(fēng)格中選擇!20TP-52KitchenCli

12、entrenderKitchen()FloorCabinet ModernWallCabinetModernFloorCabinetAntiqueFloorCabinetAntiqueWallCabinetWallCabinet 21TP-52/create the antique wall cabinetsAntiqueWallCabinet antiqueWallCabinet1 = new AntiqueWallCabinet();AntiqueWallCabinet antiqueWallCabinet2 = new AntiqueWallCabinet();/create the a

13、ntique floor cabinetsAntiqueFloorCabinet antiqueFloorCabinet1 = new AntiqueFloorCabinet();AntiqueFloorCabinet antiqueFloorCabinet2 = new AntiqueFloorCabinet();/創(chuàng)建廚房對象,假定add()方法已經(jīng)存在Kitchen antiqueKitchen = new Kitchen()antiqueKitchen.add( antiqueWallCabinet1,);antiqueKitchen.add( antiqueWallCabinet2,

14、);/render kitchen22TP-52Our design should be flexible enough to produce any of several kitchen styles.*足夠靈活的代碼,能夠產(chǎn)生幾種廚足夠靈活的代碼,能夠產(chǎn)生幾種廚房風(fēng)格的任意一種房風(fēng)格的任意一種23TP-52n不能單獨創(chuàng)建具體風(fēng)格類的對象不能單獨創(chuàng)建具體風(fēng)格類的對象n通過確定通過確定renderKitchen()方法的參數(shù)替代()方法的參數(shù)替代對象的創(chuàng)建對象的創(chuàng)建 new AntiqueWallCabinet(); / Only applies to antique style, Repla

15、ce!myStyle.getWallCabinet() ; /Applies to the style chosen at runtime! good!myStyle類決定了類決定了getWallCabinet()執(zhí)行的版本,產(chǎn)生合適的壁柜。執(zhí)行的版本,產(chǎn)生合適的壁柜。24TP-52n必須引入必須引入New ClassqKitchenStyleqMethods?q多態(tài)性在子類中的實現(xiàn)?多態(tài)性在子類中的實現(xiàn)?q考慮:如果考慮:如果myStyle是是ModernKStyle或或AntiqueKStyle的對象時,的對象時,運行中執(zhí)行操作有何不同?運行中執(zhí)行操作有何不同?AntiqueKStyleg

16、etWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()25TP-52AntiqueKStylegetWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet AntiqueWal

17、lCabinetAntiqueFloorCabinetFloorCabinet getFloorCabinet() return new AntiqueFloorCabinet(); FloorCabinet getFloorCabinet() return new ModernFloorCabinet(); 26TP-52KitchenStylegetWallCabinet()getFloorCabinet()KitchengetWallCabinet()getFloorcabinet()ClientrenderKitchen( KitchenStyle )ModernKStylegetWa

18、llCabinet()getFloorCabinet()AntiqueKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet ModernWallCabinetModernFloorCabinetAntiqueWallCabinetAntiqueFloorCabinet27TP-52nClient代碼中引用了代碼中引用了Kitchen,KitchenStyle,WallCabinet和和FloorCabinet類,但沒有引用具類,但沒有引用具體的風(fēng)格類;體的風(fēng)格類;n如何實現(xiàn)?如何實現(xiàn)?qmyStyle實例化,比如是類實例

19、化,比如是類ModernStyle的實例的實例q當(dāng)方法當(dāng)方法renderKitchenStyle()執(zhí)行到()執(zhí)行到nWallCabinet wallCabinet7 = myStyle.getWallCabinet();n可以明確地返回一個可以明確地返回一個ModernWall對象對象28TP-52/風(fēng)格的確定通過實例化myStyle,KitchenStyle myStyle = new ModernKstyle();/ create the wall cabinetsWallCabinet WallCabinet1 = myStyle.getWallCabinet(); WallCabin

20、et WallCabinet2 = myStyle.getWallCabinet(); /create the floor cabinetsFloorCabinet FloorCabinet1 = myStyle.getFloorCabinet();FloorCabinet FloorCabinet2 = myStyle.getFloorCabinet();/創(chuàng)建廚房對象,假定add()方法已經(jīng)存在Kitchen kitchen = new Kitchen()kitchen.add(WallCabinet1,); kitchen.add(WallCabinet2,);kitchen.add(F

21、loorCabinet1,); kitchen.add(FloorCabinet2,);29TP-52nrenderKitchen()相比以前的版本更通用()相比以前的版本更通用n適用于所有風(fēng)格適用于所有風(fēng)格n重復(fù)代碼少重復(fù)代碼少n泛化一下泛化一下30TP-52StylegetComponentA()getComponentB()ClientdoOperation( Style myStyle )Style1getComponentA()getComponentB()Style2getComponentA()getComponentB()ComponentA ComponentBStyle1C

22、omponentAStyle1ComponentBStyle2ComponentAStyle2ComponentBCollection31TP-52nClient的的doOperation( Style myStyle )方法構(gòu)建了一個方法構(gòu)建了一個collection實例,例如實例,例如myStyle是是Style1類的對象類的對象nmyStyle的兩個操作將分別產(chǎn)生的兩個操作將分別產(chǎn)生Style1ComponentA和和Style1ComponentB對象對象n這種模式能夠始終確保一個協(xié)調(diào)的風(fēng)格!這種模式能夠始終確保一個協(xié)調(diào)的風(fēng)格!32TP-52StylegetComponentA()ge

23、tComponentB()ClientdoOperation()Style1getComponentA()getComponentB()Style2getComponentA()getComponentB()ComponentA ComponentBStyle1ComponentAStyle1ComponentBStyle2ComponentAStyle2ComponentBCollection getComponentA()getComponentB()沒有參數(shù)沒有參數(shù)聚合了聚合了Style類類不直接引不直接引用用Style類類運行時實運行時實例化例化33TP-52- class combi

24、nation and algorithm fulfilling a common design purpose.*通過類的組合和相關(guān)算法完成公共的通過類的組合和相關(guān)算法完成公共的設(shè)計目標(biāo)設(shè)計目標(biāo) 設(shè)計模式設(shè)計模式34TP-521. 客戶任務(wù)2. 建立任務(wù)ACA. Static viewpointB. Dynamic viewpoint3. 任務(wù):設(shè)計模式的應(yīng)用DB(i) Abstract level(ii) Concrete level(class model)(sequence or state diagram): Reference direction35TP-52n靜態(tài)觀點:解決如何創(chuàng)建

25、,由什么創(chuàng)建對象的靜態(tài)觀點:解決如何創(chuàng)建,由什么創(chuàng)建對象的問題問題n動態(tài)觀點:解決怎樣發(fā)揮模式的功能問題動態(tài)觀點:解決怎樣發(fā)揮模式的功能問題36TP-52AntiqueKStylegetWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet AntiqueWallCabinetAntiqueFloorCabinetFloorCabinet getFloorCabi

26、net() return new AntiqueFloorCabinet(); FloorCabinet getFloorCabinet() return new ModernFloorCabinet(); 37TP-52getWallCabinet()myStyle:KitchenStyleClientmyStyle:ModernKStylemyStyle:AntiqueKStylerenderKitchen( myStyle )wallCabinet1:ModernWallCabinetwallCabinet1:AntiqueWallCabinetModernWallCabinet()ge

27、tWallCabinet()AntiqueWallCabinet()myStyle.getWallCabinet()- IF myStyle BELONGS TO ModernKStyle - IF myStyle BELONGS TO AntiqueKStyle -38TP-52n抽象層抽象層n具體層具體層(非抽象層非抽象層)n分成兩層可以使用抽象層更加通用的類來編寫分成兩層可以使用抽象層更加通用的類來編寫客戶代碼,更具有通用性??蛻舸a,更具有通用性。39TP-52KitchenStyleKitchenClientModernKStyleAntiqueKStyleWallCabinet F

28、loorCabinet ModernWallCabinetModernFloorCabinetAntiqueWallCabinetAntiqueFloorCabinetAbstract levelConcrete level40TP-522. 客戶角色(誰來用設(shè)計模式)客戶角色(誰來用設(shè)計模式)*特定類的特定方法特定類的特定方法1. 設(shè)計模式應(yīng)用設(shè)計模式應(yīng)用Interface to the pattern (frequently abstract; possibly several classes)DPClientDPInterfaceRest of thedesign patternappl

29、icationInteracts with the design pattern only through its interface3. 運行時建立角色運行時建立角色 其他應(yīng)用部分其他應(yīng)用部分 No limitations41TP-52nDP的形式非常有限的形式非常有限q基于委托(基于委托(delegation)q基于遞歸(基于遞歸(recursion)42TP-52 new AntiqueWallCabinet(); / Only applies to antique style, Replace!myStyle.getWallCabinet() ; /Applies to the sty

30、le chosen at runtime! good!放棄直接調(diào)用,把構(gòu)建操作委托給一個中間方法。 獲得靈活性!實現(xiàn)委托的通用方法:通過一個類把功能委托給一個抽象類如:創(chuàng)建WallCabinet對象委托給KitchenStyle對象(myStyle)的方法!43TP-52requiredFunction() intermediaryFunction( ) requiredFunction() ClientclientFunction() intermediaryFunction()replace clientFunction( ) intermediaryFunction( ) 44TP-52DoerBasedoIt()DPInterfaceinterfaceMethod()ConcreteDoer1doIt()ConcreteDoer2doIt(). . .doerObject interfaceMethod( ) doerObject.doIt() Client可能是ConcreteDoer1的一個對象!實現(xiàn)委托45TP-52RecursionBasedoOperation()Nonrec

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論