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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、不斷發(fā)現(xiàn)問題和找尋問題的解決方案的時(shí)候,發(fā)現(xiàn)有一些問題及其解決的解決方案的時(shí)候,發(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模式同時(shí)也是一種表達(dá)式框架。模式同時(shí)也是一種表達(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為了與其他人交流,通常還要求給這個(gè)問題和為了與其他人交流,通常還要求給這個(gè)問題和問題的答案一個(gè)名字問題的答案一個(gè)名字6TP-52n1987年年Ward Cunningham和和Kent Beck使用使用Alexander的理論發(fā)展出一個(gè)有五個(gè)模式的語言來指導(dǎo)的理論發(fā)展出一個(gè)有五個(gè)模式的語言來指導(dǎo)Smalltalk開發(fā)開發(fā)nJim Coplien搜集搜集C+語言的成例語言的成例(idioms),成例是,成例是模式的一

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

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

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

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

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

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

11、inetsCountertop18TP-52 ModernClassicAntiqueArts & Crafts19TP-52nKitchenViewer的具體設(shè)計(jì)目標(biāo)是什么?的具體設(shè)計(jì)目標(biāo)是什么?nSolutions:q不管風(fēng)格如何,繪制過程不應(yīng)多次重復(fù)不管風(fēng)格如何,繪制過程不應(yīng)多次重復(fù)q是否可提供如是否可提供如renderKitchen(myStyle)方法方法q通過參數(shù)控制繪制過程通過參數(shù)控制繪制過程q因此,因此,q應(yīng)用程序在運(yùn)行時(shí)必須構(gòu)造一個(gè)對(duì)象族:這個(gè)設(shè)計(jì)應(yīng)用程序在運(yùn)行時(shí)必須構(gòu)造一個(gè)對(duì)象族:這個(gè)設(shè)計(jì)必須能夠在幾種風(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)建廚房對(duì)象,假定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不能單獨(dú)創(chuàng)建具體風(fēng)格類的對(duì)象不能單獨(dú)創(chuàng)建具體風(fēng)格類的對(duì)象n通過確定通過確定renderKitchen()方法的參數(shù)替代()方法的參數(shù)替代對(duì)象的創(chuàng)建對(duì)象的創(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)性在子類中的實(shí)現(xiàn)?多態(tài)性在子類中的實(shí)現(xiàn)?q考慮:如果考慮:如果myStyle是是ModernKStyle或或AntiqueKStyle的對(duì)象時(shí),的對(duì)象時(shí),運(yùn)行中執(zhí)行操作有何不同?運(yùn)行中執(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如何實(shí)現(xiàn)?如何實(shí)現(xiàn)?qmyStyle實(shí)例化,比如是類實(shí)例

19、化,比如是類ModernStyle的實(shí)例的實(shí)例q當(dāng)方法當(dāng)方法renderKitchenStyle()執(zhí)行到()執(zhí)行到nWallCabinet wallCabinet7 = myStyle.getWallCabinet();n可以明確地返回一個(gè)可以明確地返回一個(gè)ModernWall對(duì)象對(duì)象28TP-52/風(fēng)格的確定通過實(shí)例化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)建廚房對(duì)象,假定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è)方法構(gòu)建了一個(gè)collection實(shí)例,例如實(shí)例,例如myStyle是是Style1類的對(duì)象類的對(duì)象nmyStyle的兩個(gè)操作將分別產(chǎn)生的兩個(gè)操作將分別產(chǎn)生Style1ComponentA和和Style1ComponentB對(duì)象對(duì)象n這種模式能夠始終確保一個(gè)協(xié)調(diào)的風(fēng)格!這種模式能夠始終確保一個(gè)協(xié)調(diào)的風(fēng)格!32TP-52StylegetComponentA()ge

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

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

25、,由什么創(chuàng)建對(duì)象的靜態(tài)觀點(diǎn):解決如何創(chuàng)建,由什么創(chuàng)建對(duì)象的問題問題n動(dòng)態(tài)觀點(diǎn):解決怎樣發(fā)揮模式的功能問題動(dòng)態(tài)觀點(diǎn):解決怎樣發(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è)計(jì)模式)客戶角色(誰來用設(shè)計(jì)模式)*特定類的特定方法特定類的特定方法1. 設(shè)計(jì)模式應(yīng)用設(shè)計(jì)模式應(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ùn)行時(shí)建立角色運(yùn)行時(shí)建立角色 其他應(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)建操作委托給一個(gè)中間方法。 獲得靈活性!實(shí)現(xiàn)委托的通用方法:通過一個(gè)類把功能委托給一個(gè)抽象類如:創(chuàng)建WallCabinet對(duì)象委托給KitchenStyle對(duì)象(myStyle)的方法!43TP-52requiredFunction() intermediaryFunction( ) requiredFunction() ClientclientFunction() intermediaryFunction()replace clientFunction( ) intermediaryFunction( ) 44TP-52DoerBasedoIt()DPInterfaceinterfaceMethod()ConcreteDoer1doIt()ConcreteDoer2doIt(). . .doerObject interfaceMethod( ) doerObject.doIt() Client可能是ConcreteDoer1的一個(gè)對(duì)象!實(shí)現(xiàn)委托45TP-52RecursionBasedoOperation()Nonrec

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論