面向?qū)ο笤O(shè)計_第1頁
面向?qū)ο笤O(shè)計_第2頁
面向?qū)ο笤O(shè)計_第3頁
面向?qū)ο笤O(shè)計_第4頁
面向?qū)ο笤O(shè)計_第5頁
已閱讀5頁,還剩170頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο笤O(shè)計2023最新整理收集do

something7面向?qū)ο笤O(shè)計3設(shè)計模式DesignPattern面向?qū)ο笱芯康男骂I(lǐng)域20世紀(jì)90年代,面向?qū)ο蠓椒ㄅc技術(shù)在國內(nèi)軟件業(yè)界十分火爆,人們熱衷于談?wù)摗皩ο蟆辈⒁詾闃s。十多年來,人們發(fā)表、出版了無數(shù)的文章和書籍?,F(xiàn)在,該寫的似乎都寫完了,沒有新花樣玩了,真是一片無聊設(shè)計模式(DesignPattern)及時問世,面向?qū)ο髳酆谜邆兘K于有了新的追求7面向?qū)ο笤O(shè)計4設(shè)計模式:起源起源ChristopherAlexander當(dāng)代著名建筑大師加州大學(xué)伯克利分校建筑學(xué)教授、環(huán)境結(jié)構(gòu)研究所所長、美國藝術(shù)與科學(xué)院院士在建筑、室內(nèi)、計算機、家具設(shè)計甚至哲學(xué)方面都卓有建樹著作:《APatternLanguage》、《TheTimelessWayofBuilding》7面向?qū)ο笤O(shè)計5設(shè)計模式:起源Gof(GangOfFour,“四人幫”)ErichGamma,RichardHelm,RalphJohnson,JohnVlissides1995年出版了《DesignPatterns:ElementsofReusableObject-OrientedSoftware》該書確立了設(shè)計模式這個術(shù)語,創(chuàng)導(dǎo)了一種新的面向?qū)ο笤O(shè)計思潮。從此,參與設(shè)計模式研究的人數(shù)爆炸性地增長7面向?qū)ο笤O(shè)計6Ralph,Erich,Richard,andJohn7面向?qū)ο笤O(shè)計7設(shè)計模式什么叫模式?“每一個模式描述了在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該解決方案而不必重復(fù)勞動”盡管軟件技術(shù)發(fā)展非???,但是仍然有非常多的設(shè)計模式可以讓我們套用設(shè)計模式可以幫助人們簡便地復(fù)用以前成功的設(shè)計方案,提高工作效率7面向?qū)ο笤O(shè)計8設(shè)計模式:研究現(xiàn)狀設(shè)計模式的研究現(xiàn)狀pattern與Java、C#pattern與組件技術(shù)(如CORBA)pattern與系統(tǒng)結(jié)構(gòu)pattern與泛型編程(genericprogramming)相結(jié)合其他(例如UML等)7面向?qū)ο笤O(shè)計9模式的分類(gof提出的23個)創(chuàng)建型結(jié)構(gòu)型行為型類FactoryMethodAdapter(類)InterpreterTemplateMethod

對象AbstractFactoryBuilderPrototypeSingletonAdapter(對象)BridgeCompositeDecoratorFacadeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor7面向?qū)ο笤O(shè)計10Bridge(橋梁)模式案例有一個叫做HuntBird的游戲,里面需要表示各種各樣的鳥類7面向?qū)ο笤O(shè)計11Bridge(橋梁)模式最初的設(shè)計7面向?qū)ο笤O(shè)計12Bridge(橋梁)模式需求變化:鳥類要會飛7面向?qū)ο笤O(shè)計13Bridge(橋梁)模式如果增加一種鳥類“企鵝”呢?7面向?qū)ο笤O(shè)計14Bridge(橋梁)模式改進(jìn)方法:對“飛”使用多態(tài)7面向?qū)ο笤O(shè)計15Bridge(橋梁)模式改進(jìn)方法:再次使用繼承7面向?qū)ο笤O(shè)計16Bridge(橋梁)模式如果增加“游泳”行為呢?7面向?qū)ο笤O(shè)計17Bridge(橋梁)模式繼承只會使得問題越來越復(fù)雜繼承是面向?qū)ο蟮幕痉▽毎???OO=類+對象+繼承+消息通信設(shè)計原則1:組合優(yōu)先優(yōu)先使用組合,而不是繼承7面向?qū)ο笤O(shè)計18設(shè)計原則:組合優(yōu)先繼承復(fù)用的優(yōu)點可以很容易的修改或擴展父類的實現(xiàn)7面向?qū)ο笤O(shè)計19設(shè)計原則:組合優(yōu)先繼承復(fù)用的缺點繼承破壞封裝,因為父類的實現(xiàn)細(xì)節(jié)完全暴露給子類(白盒復(fù)用)父類的實現(xiàn)發(fā)生改變,則子類必受牽連繼承是靜態(tài)的,不能在運行時發(fā)生改變,不靈活7面向?qū)ο笤O(shè)計20設(shè)計原則:組合優(yōu)先組合復(fù)用的優(yōu)點不破壞封裝,這種復(fù)用是黑盒復(fù)用,因為成員對象的內(nèi)部細(xì)節(jié)對新對象保密所需依賴少(只依賴接口)是動態(tài)的,可以把成員對象動態(tài)替換為另一個類型相同的對象組合復(fù)用的缺點對象數(shù)量會增加使用委托(delegation)會使得系統(tǒng)復(fù)雜7面向?qū)ο笤O(shè)計21設(shè)計原則:組合優(yōu)先組合優(yōu)先Favorcompositionoverinheritance當(dāng)需要應(yīng)對變化的時候,應(yīng)該首先使用組合的方式,而不是繼承因為組合更加靈活例1:汽車有很多種,小轎車、貨車、客車,有的車是客貨兩用,有的車水陸兩用7面向?qū)ο笤O(shè)計22設(shè)計原則:組合優(yōu)先如果使用繼承來描述:一旦增加新的汽車種類或用途,都需要大量改動原有代碼7面向?qū)ο笤O(shè)計23設(shè)計原則:組合優(yōu)先使用“組合”思路考慮問題“汽車”擁有某種或某些“用途”“汽車”和“用途”獨立變化,互不影響7面向?qū)ο笤O(shè)計24設(shè)計原則:組合優(yōu)先區(qū)分“Is-A”與“Has-A”有一個系統(tǒng)需要描述經(jīng)理、雇員和學(xué)生它們都是人,所以:7面向?qū)ο笤O(shè)計25設(shè)計原則:組合優(yōu)先問題有些人既是經(jīng)理,又是學(xué)生,比如某位在讀MBA的老總7面向?qū)ο笤O(shè)計26設(shè)計原則:組合優(yōu)先換一個角度看問題雇員、經(jīng)理、學(xué)生其實都是角色的一種人擁有角色7面向?qū)ο笤O(shè)計27Bridge(橋梁)模式是什么導(dǎo)致設(shè)計的不完美?變化,無法避免的、經(jīng)常的需求變化設(shè)計者的理想當(dāng)需求變化的時候,盡可能少的修改代碼就可以滿足新的需求設(shè)計原則2:封裝可變性發(fā)現(xiàn)代碼容易變化的部分,封裝之,使它和不容易變化的部分獨立開來7面向?qū)ο笤O(shè)計28Bridge(橋梁)模式“發(fā)現(xiàn)變化點”7面向?qū)ο笤O(shè)計29Bridge(橋梁)模式“封裝變化點”變化點1:小鳥一家7面向?qū)ο笤O(shè)計30Bridge(橋梁)模式“封裝變化點”變化點2:鳥類的行為——飛7面向?qū)ο笤O(shè)計31Bridge(橋梁)模式“封裝變化點”變化點2:鳥類的行為——游泳7面向?qū)ο笤O(shè)計32Bridge(橋梁)模式“使變化點和不變點獨立開來”在這個例子里其實是兩個變化點相獨立“鳥類”和“行為”什么關(guān)系?鳥類擁有行為鳥類行為的具體實現(xiàn),委托“行為”類來完成7面向?qū)ο笤O(shè)計33鳥兒擁有飛、游泳的行為7面向?qū)ο笤O(shè)計34Bridge(橋梁)模式使用橋梁模式的效果比如增加一種鳥類“鵝”,相應(yīng)的要增加一種游泳的行為“紅掌撥清波”只需要增加一個鳥類的子類“鵝”增加一個游泳的行為“紅掌撥清波”設(shè)置“鵝”的飛翔行為為“飛不起來”設(shè)置“鵝”的游泳行為為“紅掌撥清波”原有代碼不需要改動!7面向?qū)ο笤O(shè)計35Bridge(橋梁)模式7面向?qū)ο笤O(shè)計36Bridge(橋梁)模式使用橋梁模式的效果當(dāng)需求改變的時候(增加動物或行為),只需要簡單添加幾個類對原有代碼不需要改動保證了代碼的穩(wěn)定,提高了可維護(hù)性設(shè)計原則3:開-閉原則在設(shè)計一個軟件的時候,應(yīng)當(dāng)使這個軟件可以在不被修改的前提下擴展7面向?qū)ο笤O(shè)計37Bridge(橋梁)模式結(jié)構(gòu)7面向?qū)ο笤O(shè)計38Bridge(橋梁)模式意圖將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化適用性抽象和它的實現(xiàn)部分可以獨立變化類的抽象以及它的實現(xiàn)都可以通過生成子類的方法加以擴充實現(xiàn)部分的修改不會對客戶產(chǎn)生影響......7面向?qū)ο笤O(shè)計39Bridge(橋梁)模式應(yīng)用舉例1:“小朋友畫畫”使用蠟筆需要大中小三種型號每種型號各有12種顏色共36支7面向?qū)ο笤O(shè)計40Bridge(橋梁)模式使用毛筆:大、中、小3支毛筆12種顏料7面向?qū)ο笤O(shè)計41Bridge(橋梁)模式蠟筆和毛筆的差別蠟筆:筆和顏色無法分離,因此需要36種蠟筆毛筆:筆和顏色可以獨立選擇,因此只有3+12=15個子類體現(xiàn)了Bridge模式將繼承關(guān)系轉(zhuǎn)換為組合關(guān)系,從而降低了系統(tǒng)間的耦合,減少了代碼冗余7面向?qū)ο笤O(shè)計42Bridge(橋梁)模式應(yīng)用舉例2有一個CAD軟件,可以畫多種圖形同時支持多套繪圖算法傳統(tǒng)的設(shè)計7面向?qū)ο笤O(shè)計43Bridge(橋梁)模式應(yīng)用Bridge模式7面向?qū)ο笤O(shè)計44Bridge(橋梁)模式分析圖形Shape是一個抽象概念,它可以有許多具體化(變化點1)圖形的顯示Drawing是圖形的實現(xiàn),它也可以有許多套算法(變化點2)Bridge模式使用組合代替繼承,避免了復(fù)雜的繼承體系,使得兩個變化點獨立變化,互不影響7面向?qū)ο笤O(shè)計45設(shè)計原則:開-閉原則、封裝可變性“開-閉”原則BertrandMeyer:“Softwareshouldbeopenforextension,butclosedformodification”在設(shè)計一個軟件的時候,應(yīng)當(dāng)使這個軟件可以在不被修改的前提下擴展解釋已有模塊,尤其是最重要的抽象層模塊不能動:保證穩(wěn)定性和延續(xù)性可以擴展新模塊:增加新行為,保證靈活性7面向?qū)ο笤O(shè)計46設(shè)計原則:開-閉原則、封裝可變性BertrandMeyer對象技術(shù)大師法國工程院院士蘇黎世工學(xué)院計算機系教授發(fā)明了Eiffel語言和按契約設(shè)計(DesignbyContract)的思想早年參與了Z形式語言的設(shè)計名著《面向?qū)ο筌浖?gòu)造》7面向?qū)ο笤O(shè)計47設(shè)計原則:開-閉原則、封裝可變性玉帝遵照“開-閉”原則維護(hù)天庭秩序當(dāng)年孫悟空大鬧天空,向天庭發(fā)出挑戰(zhàn):“皇帝輪流做,明年到我家......只教他搬出去,將天宮讓與我!”太白金星給玉皇大帝 建議道:“降一道招安 圣旨,把他宣來上界... 與他籍名在箓... 一則不動眾勞師, 二則收仙有道也。”7面向?qū)ο笤O(shè)計48設(shè)計原則:開-閉原則、封裝可變性分析“不動眾勞師”、不破壞天規(guī)就是“閉”收仙有道就是“開”招安,就是玉帝的“開-閉”原則:既讓孫悟空滿意,又不必更改天庭現(xiàn)有的秩序7面向?qū)ο笤O(shè)計49設(shè)計原則:開-閉原則、封裝可變性分析現(xiàn)有的天庭秩序是系統(tǒng)的最高抽象層弼馬溫這個職位只是具體的實現(xiàn)層招安的關(guān)鍵就是不允許更改現(xiàn)有的天庭秩序,但是允許將妖猴納入到文武百官中,從而擴展了這一秩序的具體實現(xiàn)7面向?qū)ο笤O(shè)計50設(shè)計原則:開-閉原則、封裝可變性“封裝可變性原則”gof:“考慮你的設(shè)計中什么可能會發(fā)生變化......考慮你允許什么發(fā)生變化而不讓這一變化導(dǎo)致重新設(shè)計”Shalloway:“發(fā)現(xiàn)變化點,并封裝之”一種可變性不應(yīng)散落在代碼的很多角落一種可變性不應(yīng)當(dāng)與另一種可變性混合在一起7面向?qū)ο笤O(shè)計51設(shè)計原則:開-閉原則、封裝可變性設(shè)計模式對“開-閉”原則的支持比如Bridge橋梁模式:將抽象部分和實現(xiàn)部分分別封裝,可以分別獨立變化7面向?qū)ο笤O(shè)計52設(shè)計原則:開-閉原則、封裝可變性對“開-閉”原則支持的不好的例子java.util.Calendarjava提供的描述歷法的抽象類描述公歷的子類我們希望再派生出一個子類,用于描述陰歷7面向?qū)ο笤O(shè)計53設(shè)計原則:開-閉原則、封裝可變性問題:Calendar只定義了適用于公歷的常量和方法publicfinalstaticintSUNDAY=1;publicfinalstaticintMONDAY=2;...publicfinalstaticintJANUARY=0;publicfinalstaticintFEBRUARY=1;...publicvoidsetFistDayOfWeek(intvalue);publicintgetFirstDayOfWeek();...7面向?qū)ο笤O(shè)計54設(shè)計原則:開-閉原則、封裝可變性問題英文的星期、月份名稱不符合中國陰歷的叫法陰歷以10天為一周,公歷和陰歷每月的天數(shù)也不同,所以Calendar關(guān)于星期、月份的算法不適合陰歷總之,Calendar無法容納中國陰歷,因此不支持“開-閉”原則7面向?qū)ο笤O(shè)計55Strategy(策略)模式橋梁模式使得兩個變化點的獨立7面向?qū)ο笤O(shè)計56Strategy(策略)模式單獨看飛的行為的實現(xiàn)策略模式:封裝了一系列算法,使得它們可以相互替換效果:算法可以獨立變化7面向?qū)ο笤O(shè)計57Strategy(策略):定義所有支持的算法的公共接口ConcreteStrategy(具體策略):實現(xiàn)具體算法Context(上下文):用一個ConcreteStrategy對象來配置維護(hù)一個對Strategy對象的引用可定義一個接口來讓Strategy訪問它的數(shù)據(jù)7面向?qū)ο笤O(shè)計58限制變化的影響范圍增加新功能,要做到只增加新代碼,而不改動老代碼盡量用組合,而不是繼承階段小結(jié)設(shè)計原則組合優(yōu)先開-閉原則封裝可變性7面向?qū)ο笤O(shè)計59階段小結(jié)策略模式使得算法可以獨立變化使用組合取代繼承,封裝了可變性,保證了“開-閉”橋梁模式使得抽象和實現(xiàn)獨立變化避免了兩個變化點的耦合7面向?qū)ο笤O(shè)計60Adapter(適配器)模式例子1:“不合適的插座”你的電腦的插頭是三相的而墻上的插座只有兩相的插頭和插座的“接口”不匹配,怎么辦?7面向?qū)ο笤O(shè)計61Adapter(適配器)模式例子2:HuntBird游戲中,希望增加一種鳥類“鴨子”但是發(fā)現(xiàn)以前有一個系統(tǒng)中已經(jīng)有了“鴨子”類,希望重用老代碼7面向?qū)ο笤O(shè)計62Adapter(適配器)模式新老代碼接口不一致7面向?qū)ο笤O(shè)計63Adapter(適配器)模式疑問把老代碼修改一下不就可以了么?如下:7面向?qū)ο笤O(shè)計64Adapter(適配器)模式否定首先,老代碼不一定允許修改比如可能根本沒有代碼,只有鏈接庫其次,修改代碼工作量可能很大容易出錯還記得“開-閉原則”么7面向?qū)ο笤O(shè)計65Adapter(適配器)模式應(yīng)用(對象)適配器模式實現(xiàn)接口轉(zhuǎn)換7面向?qū)ο笤O(shè)計66Adapter(適配器)模式客戶(鳥)被適配者(鴨子)適配器請求轉(zhuǎn)換后的請求理解1:接口轉(zhuǎn)換7面向?qū)ο笤O(shè)計67Adapter(適配器)模式叫呷呷叫7面向?qū)ο笤O(shè)計68Adapter(適配器)模式理解2:重新包裝,改變接口7面向?qū)ο笤O(shè)計69Adapter(適配器)模式類適配器7面向?qū)ο笤O(shè)計70Adapter(適配器)模式結(jié)構(gòu)對象Adapter7面向?qū)ο笤O(shè)計71Adapter(適配器)模式結(jié)構(gòu)類Adapter7面向?qū)ο笤O(shè)計72Adapter(適配器)模式意圖將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作7面向?qū)ο笤O(shè)計73Adapter(適配器)模式應(yīng)用舉例1我們打算編寫一個畫圖軟件其中畫圓形已經(jīng)有了一個現(xiàn)成的類但是接口不同,不能直接使用7面向?qū)ο笤O(shè)計74Adapter(適配器)模式使用對象Adapter7面向?qū)ο笤O(shè)計75Adapter(適配器)模式應(yīng)用舉例2缺省適配模式——“魯達(dá)剃度”凡是和尚都應(yīng)該如此:7面向?qū)ο笤O(shè)計76Adapter(適配器)模式但是魯智深并不是這樣魯智深::習(xí)武(){

拳打鎮(zhèn)關(guān)西();

大鬧五臺山();

倒拔垂楊柳();

火燒瓦官寺();}7面向?qū)ο笤O(shè)計77Adapter(適配器)模式所以當(dāng)初魯達(dá)剃度時,眾僧說:“這個人形容丑惡,相貌兇頑,不可剃度”?7面向?qū)ο笤O(shè)計78Adapter(適配器)模式但是長老卻說:“此人上應(yīng)天星,心地剛直。雖然時下兇頑,命中駁雜,久后卻得清靜。證過非凡,汝等皆不及他”7面向?qū)ο笤O(shè)計79Adapter(適配器)模式“天星”就是缺省適配器當(dāng)你不想/不能實現(xiàn)接口的所有方法時利用缺省適配器類,提供這些方法的缺省實現(xiàn)從這個類再派生出的子類就可以不去實現(xiàn)那些不想實現(xiàn)的方法了7面向?qū)ο笤O(shè)計80設(shè)計原則:里氏代換原則例子1:“圓是不是橢圓?”在幾何學(xué)里,圓是橢圓的一種特殊情況因此,把橢圓看作父類,把圓作為子類7面向?qū)ο笤O(shè)計81設(shè)計原則:里氏代換原則問題橢圓有長軸、短軸圓會完全繼承下來這些對于圓來說毫無意義類似的:“正方形不是矩形”Circlecircle;circle.GetMajorAxis();7面向?qū)ο笤O(shè)計82設(shè)計原則:里氏代換原則例子2:“企鵝不是鳥的子類”凡是鳥都會飛但是企鵝不會7面向?qū)ο笤O(shè)計83設(shè)計原則:里氏代換原則例子3我們需要設(shè)計一個類FileName來描述文件名,而文件名不就是一個特殊的字符串么?所以我們?nèi)绱嗽O(shè)計:7面向?qū)ο笤O(shè)計84設(shè)計原則:里氏代換原則問題凡是字符串都支持相加操作,也就是說兩個字符串相加,結(jié)果還是一個字符串可是兩個文件名相加,還是一個合法的文件名么?比如:“c:\a.txt”+“d:\b.txt”結(jié)果是:“c:\a.txtd:\b.txt”7面向?qū)ο笤O(shè)計85設(shè)計原則:里氏代換原則錯在哪里?墨子論“取譬”“白馬,馬也;乘白馬,乘馬也。驪馬,馬也;乘驪馬,乘馬也?!苯忉專喊遵R、驪馬(黑馬)都是馬,既然馬可以騎,那么白馬和驪馬肯定也可以騎7面向?qū)ο笤O(shè)計86設(shè)計原則:里氏代換原則LiskovSubstitutionPrinciple一個軟件如果使用的是一個父類的話,如果把該父類換成子類,它不能察覺出父類對象和子類對象的區(qū)別也就是凡是父類適用的地方子類也適用繼承只有滿足里氏代換原則才是合理的設(shè)計原則4:里氏代換原則凡是父類適用的地方子類應(yīng)當(dāng)也適用7面向?qū)ο笤O(shè)計87設(shè)計原則:里氏代換原則反過來的代換不成立子類適用的地方不要求父類一定能適用墨子又說“娣,美人也,愛娣,非愛美人也......盜,人也,惡盜,非惡人也”妹妹是美女,哥哥喜歡妹妹,并不是因為喜歡美女小偷是人,討厭小偷,并不討厭所有人7面向?qū)ο笤O(shè)計88設(shè)計原則:里氏代換原則Java語言對此類問題的防范它的String類是final的,不能繼承正確的方法使用Adapter模式7面向?qū)ο笤O(shè)計89設(shè)計原則:里氏代換原則Java中的反例它的Stack類是從Vector類繼承下來的“棧不就是施加了訪問限制的數(shù)組么?”所以“StackIs-AVector”7面向?qū)ο笤O(shè)計90設(shè)計原則:里氏代換原則用里氏代換原則來判斷凡是數(shù)組行得通的地方,換成棧也行得通么?Vector可以隨機訪問,可以任意修改里面的元素...這些都是Stack所不允許的因此Stack不能從Vector繼承下來,它不能擁有Vector的接口7面向?qū)ο笤O(shè)計91設(shè)計原則:里氏代換原則看看C++STL是怎么辦的STL中的stack其實是一個Adaptertemplate<classT,classCont=deque<T>>classstack{public:

void

push(constvalue_type&x){c.push_back(x);}

void

pop(){c.pop_back(x);}protected:Contc;};7面向?qū)ο笤O(shè)計92FactoryMethod(工廠方法)模式例子:“去快餐廳吃飯”7面向?qū)ο笤O(shè)計93void

BuyFood(string

餐館,string食品){

if(餐館=="KFC"){

if(食品=="Chicken")hamburger=newKFCChickenHamburger;

else

if(food=="Fish")hamburger=newKFCFishHamburger;}

else

if(restaurant=="McDonald"){

if(food=="Chicken")hamburger=newMcDonaldChickenHamburger;

else

if(food=="Fish")hamburger=newMcDonaldFishHamburger;}}7面向?qū)ο笤O(shè)計94FactoryMethod(工廠方法)模式增加一種新的食物呢?7面向?qū)ο笤O(shè)計95void

BuyFood(string

餐館,string食品){

if(餐館=="KFC"){

if(食品=="Chicken")hamburger=new

KFCChickenHamburger;

else

if(food=="Fish")hamburger=new

KFCFishHamburger;}...FactoryMethod(工廠方法)模式傳統(tǒng)設(shè)計的缺點依賴具體7面向?qū)ο笤O(shè)計96FactoryMethod(工廠方法)模式“Abstractionshouldnotdependupondetails.Detailsshoulddependuponabstractions”設(shè)計原則5:依賴倒置原則抽象不應(yīng)當(dāng)依賴于細(xì)節(jié)細(xì)節(jié)應(yīng)當(dāng)依賴于抽象7面向?qū)ο笤O(shè)計97設(shè)計原則:依賴倒置原則為什么說“倒置”傳統(tǒng)的設(shè)計是抽象層依賴具體層傳統(tǒng)的重用,側(cè)重于具體層次的模塊,比如算法、數(shù)據(jù)結(jié)構(gòu)、函數(shù)庫因此軟件的高層模塊依賴低層模塊傳統(tǒng)的依賴方向7面向?qū)ο笤O(shè)計98設(shè)計原則:依賴倒置原則高層依賴低層的問題抽象層包含的是系統(tǒng)的業(yè)務(wù)邏輯和宏觀的、戰(zhàn)略性的決定,是必然性的體現(xiàn)具體層則含有與實現(xiàn)相關(guān)的算法和邏輯,以及戰(zhàn)術(shù)性的決定,帶有相當(dāng)大的偶然性選擇。具體層經(jīng)常有變動,難免出現(xiàn)錯誤必然依賴偶然,穩(wěn)定依賴變動?7面向?qū)ο笤O(shè)計99設(shè)計原則:依賴倒置原則依賴具體的缺點7面向?qū)ο笤O(shè)計100設(shè)計原則:依賴倒置原則依賴抽象抽象一般不會變動這樣代碼不會受易變的具體層影響7面向?qū)ο笤O(shè)計101設(shè)計原則:針對接口編程如何做到“依賴倒置”?“Programtoaninterface,notanimplementation”設(shè)計原則6:針對接口編程要針對接口編程不要針對實現(xiàn)編程7面向?qū)ο笤O(shè)計102設(shè)計原則:針對接口編程“針對接口編程”的一些建議變量、參數(shù)、返回值等應(yīng)聲明為抽象類不要繼承非抽象類不要重載父類的非抽象方法當(dāng)然這些只是建議實際情況要權(quán)衡利弊7面向?qū)ο笤O(shè)計103FactoryMethod(工廠方法)模式“女媧摶土造人”《風(fēng)俗通》:“俗說天開地辟,未有人民。女媧摶黃土為人?!?面向?qū)ο笤O(shè)計104FactoryMethod(工廠方法)模式簡單工廠:根據(jù)傳入的參數(shù),決定創(chuàng)建哪一個產(chǎn)品類對象Human*

NvWa::CreateHuman(stringname){

if(name

==“ZhangSan") returnnew

ZhangSan;

elseif(name

==“LiSi") returnnew

LiSi;

elseif(name==“WangErMaZi") returnnew

WangErMaZi;}7面向?qū)ο笤O(shè)計105FactoryMethod(工廠方法)模式簡單工廠的優(yōu)缺點優(yōu)點:實現(xiàn)了責(zé)任分割利用判斷邏輯,決定實例化哪一個產(chǎn)品類客戶端可以免除直接創(chuàng)建產(chǎn)品類對象的責(zé)任,僅僅使用該產(chǎn)品缺點:沒有完全做到“開-閉”一旦增加新的產(chǎn)品,需要修改工廠的代碼但是客戶代碼不需要修改“我不入地獄誰入地獄”7面向?qū)ο笤O(shè)計106FactoryMethod(工廠方法)模式“女媧舉繩造人”“女媧摶土為人,劇務(wù),力不暇供,乃引繩于桓泥中,舉以為人。”7面向?qū)ο笤O(shè)計107FactoryMethod(工廠方法)模式簡單工廠的問題所有具體產(chǎn)品對象的創(chuàng)建都放在一個類中,一旦增加新的產(chǎn)品,當(dāng)然工廠類要被修改工廠方法:使用多態(tài)來應(yīng)對提供一個抽象工廠的接口具體工廠分別負(fù)責(zé)創(chuàng)建具體產(chǎn)品對象增加新的產(chǎn)品只需要相應(yīng)增加新的具體工廠類7面向?qū)ο笤O(shè)計108FactoryMethod(工廠方法)模式結(jié)構(gòu)7面向?qū)ο笤O(shè)計109FactoryMethod(工廠方法)模式意圖定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類使一個類的實例化延遲到其子類優(yōu)點封裝了創(chuàng)建具體對象的工作使得客戶代碼“針對接口編程”,保持對變化的“關(guān)閉”7面向?qū)ο笤O(shè)計110FactoryMethod(工廠方法)模式工廠方法應(yīng)用到“快餐店”問題7面向?qū)ο笤O(shè)計111Fa?ade(門面)模式例1:傳統(tǒng)的醫(yī)院:病人需要直接跟各個部門打交道門診掛號劃價化驗取藥7面向?qū)ο笤O(shè)計112Fa?ade(門面)模式人性化的醫(yī)院接待員代替病人進(jìn)行掛號、劃價等病人只需要和接待員打交道門診掛號劃價取藥接待員醫(yī)院的門面(Facade)7面向?qū)ο笤O(shè)計113Fa?ade(門面)模式例2:組建家庭影院7面向?qū)ο笤O(shè)計114Fa?ade(門面)模式欣賞一部電影的辛苦過程:拉上窗簾、調(diào)暗燈光拿出零食打開電視機打開功放打開音響打開DVD機找出DVD碟片把碟片放入DVD機開始播放...7面向?qū)ο笤O(shè)計115Fa?ade(門面)模式家庭影院系統(tǒng):7面向?qū)ο笤O(shè)計116Fa?ade(門面)模式用OO語言描述看電影的辛苦過程curtain.close();lights.setlight(5);tv.on();dvd.on();dvd.insertdisk(disk);dvd.play();amplifier.on();amplifier.setvolumn(5);7面向?qū)ο笤O(shè)計117Fa?ade(門面)模式缺點客戶需要和大量的類打交道操作復(fù)雜有時候操作順序不能顛倒關(guān)閉整個系統(tǒng)是不是也是一樣的復(fù)雜如果家庭影院升級了呢?7面向?qū)ο笤O(shè)計118設(shè)計原則:迪米特法則老子論“圣人之治”使民無知:“是以圣人之治,虛其心,實其腹,弱其志,常使民無知無欲”老死不相往來:“小國寡民...鄰國相望,雞犬之聲相聞,民至老死,不相往來”軟件設(shè)計師就是軟件系統(tǒng)的統(tǒng)治者應(yīng)當(dāng)使得軟件的不同對象彼此之間盡量“老死不相往來”,降低系統(tǒng)維護(hù)成本7面向?qū)ο笤O(shè)計119設(shè)計原則:迪米特法則LawofDemeter又叫做最少知識原則“只與你直接的朋友們通信”不要跟“陌生人”說話也就是信息隱藏、封裝設(shè)計原則7:迪米特法則每個軟件單元對其它單元盡可能少了解而且僅限于那些與自己密切相關(guān)的單元7面向?qū)ο笤O(shè)計120Fa?ade(門面)模式用一個門面對象簡化所有細(xì)節(jié)7面向?qū)ο笤O(shè)計121Fa?ade(門面)模式目的提供一個更簡單的系統(tǒng)接口使得復(fù)雜系統(tǒng)和客戶代碼耦合松散但是并不屏蔽原有的復(fù)雜但是功能強大的接口,用戶可以在易用性和通用性之間選擇7面向?qū)ο笤O(shè)計122Fa?ade(門面)模式舉例1:保安系統(tǒng)7面向?qū)ο笤O(shè)計123Fa?ade(門面)模式使用門面模式7面向?qū)ο笤O(shè)計124Fa?ade(門面)模式舉例2:股票7面向?qū)ο笤O(shè)計125Fa?ade(門面)模式基金7面向?qū)ο笤O(shè)計126Fa?ade(門面)模式Fa?adeV.S.Adapter共同點:改變接口不同點:目的不同F(xiàn)a?ade目的在于簡化接口Adapter目的在于適配接口,以便新老系統(tǒng)可以協(xié)同工作7面向?qū)ο笤O(shè)計127設(shè)計原則:迪米特法則門面模式對迪米特法則的體現(xiàn)門面模式創(chuàng)造出一個門面對象將客戶端所涉及的屬于內(nèi)部類的數(shù)量減到最少客戶只需要和一個門面對象打交道7面向?qū)ο笤O(shè)計128設(shè)計原則:迪米特法則迪米特法則在詳細(xì)設(shè)計中的體現(xiàn)盡量降低成員的訪問權(quán)限public->protected->private限制局部變量的有效范圍變量要用到的時候才去聲明它代碼更好懂(一看就知道這個變量是什么類型)該變量不容易被其它代碼誤改for

(inti=0;i<n;i++)...7面向?qū)ο笤O(shè)計129設(shè)計原則:接口隔離原則角色的合理劃分一個接口應(yīng)當(dāng)簡單的只代表一個角色接口污染過于臃腫的接口是對接口的污染不要把沒什么關(guān)系的接口合并在一起設(shè)計原則8:接口隔離原則一個類對另一個類的依賴應(yīng)當(dāng)建立在最小的接口上7面向?qū)ο笤O(shè)計130設(shè)計原則:接口隔離原則例子:全文搜索引擎搜索處理搜索結(jié)果生成索引7面向?qū)ο笤O(shè)計131設(shè)計原則:接口隔離原則接口分割:7面向?qū)ο笤O(shè)計132設(shè)計原則:接口隔離原則接口隔離原則和迪米特法則的關(guān)系迪米特法則要求盡量限制通信的廣度和深度而對接口進(jìn)行分割,使其最小化,避免對客戶提供不需要的服務(wù),當(dāng)然是符合迪米特法則的也體現(xiàn)了高內(nèi)聚、低耦合7面向?qū)ο笤O(shè)計133Command(命令)模式給家庭影院配一個遙控器7面向?qū)ο笤O(shè)計134Command(命令)模式傳統(tǒng)的想法:7面向?qū)ο笤O(shè)計135Command(命令)模式用戶要求:按鈕可以自定義voidRemoteControl::Button1(){ tv->On();}7面向?qū)ο笤O(shè)計136Command(命令)模式例1:“魏延謀反”諸葛亮在臨死前給楊儀一個錦囊,密囑:“我死,魏延必反,...那時自有斬魏延之人也”。同時授馬岱以密計,只待魏延喊叫時,便出其不意斬之后人有詩曰:“諸葛先機識魏延,已知日后反西川。錦囊遺計人難料,卻見成功在馬前”視頻:“魏延謀反.rm”7面向?qū)ο笤O(shè)計137Command(命令)模式結(jié)構(gòu)7面向?qū)ο笤O(shè)計138Command(命令)模式分析錦囊是對命令的封裝諸葛亮是命令的設(shè)計者,他選擇魏延作為命令的接收者楊儀和馬岱是命令的調(diào)用者,他們依據(jù)實際情況決定何時調(diào)用、是否調(diào)用命令命令運行的結(jié)果就是使得命令的接收者魏延中計,并按照預(yù)謀落入陷阱7面向?qū)ο笤O(shè)計139Command(命令)模式分析戰(zhàn)場瞬息萬變,孔明不能處處臨場指揮在這個故事里,命令模式把命令的設(shè)計者諸葛亮、調(diào)用者楊儀、馬岱和執(zhí)行者魏延完全分割開,互相可以靈活變化命令由諸葛亮設(shè)計并封裝,交由楊儀、馬岱等待時機成熟時調(diào)用,調(diào)用結(jié)果就是命令的接收者魏延中計7面向?qū)ο笤O(shè)計140漢堡可樂薯條點菜單顧客知道自己想要什么,并填寫菜單服務(wù)員接過菜單交給廚師廚師根據(jù)菜單上的要求把飯菜做好例2:餐廳的工作流程菜單記錄了顧客的要求7面向?qū)ο笤O(shè)計141Command(命令)模式結(jié)構(gòu)7面向?qū)ο笤O(shè)計142Command(命令)模式人物關(guān)系顧客(Client):決定要點什么菜點菜單(Command):封裝了顧客的要求服務(wù)員(Invoker):決定如何、何時將菜單送達(dá)廚師(Receiver):顧客要求的接收者,是唯一知道如何做菜的7面向?qū)ο笤O(shè)計143Command(命令)模式運作過程:7面向?qū)ο笤O(shè)計144命令(Command):聲明執(zhí)行操作的接口具體命令(ConcreteCommand):將一個接收者對象綁定于一個動作;調(diào)用接收者相應(yīng)的操作,以實現(xiàn)Execute()客戶(Client):創(chuàng)建具體命令對象并設(shè)定它的接收者調(diào)用者(Invoker):要求該命令執(zhí)行這個請求接收者(Receiver):知道如何實施與執(zhí)行一個請求相關(guān)的操作,任何類都可以作為一個接收者7面向?qū)ο笤O(shè)計145Command(命令)模式效果可以很方便的增加新的命令將調(diào)用操作的對象(Invoker)與知道如何實現(xiàn)該操作的對象(Receiver)解耦將命令裝配成對象,容易實現(xiàn)Undo/Redo和日志功能可以實現(xiàn)事務(wù)管理:把多個命令合成為一個,相當(dāng)于宏命令7面向?qū)ο笤O(shè)計146Command(命令)模式命令模式應(yīng)用在遙控器上:7面向?qū)ο笤O(shè)計147Command(命令)模式效果命令的調(diào)用者遙控器和執(zhí)行者電視機等設(shè)備完全解耦用戶可以動態(tài)設(shè)置遙控器按鈕的功能這一切都不需要修改遙控器代碼做到了松散耦合,遵循了“開-閉”原則7面向?qū)ο笤O(shè)計148Command(命令)模式應(yīng)用舉例1:“劉備東吳招親”周瑜與孫權(quán)定下計謀,以孫權(quán)之妹為誘餌,騙劉備到東吳招親,想趁機殺害劉備,索回荊州諸葛亮早識破了詭計,令趙云護(hù)衛(wèi)劉備前往,并給他三個錦囊,囑咐他依次執(zhí)行。結(jié)果,趙云按照諸葛亮的錦囊妙計行事,不僅幫助劉備將孫權(quán)之妹孫尚香夫人迎娶回來,還得到孫權(quán)之母吳國太的歡心,陪同劉備夫婦回了荊州《三國演義》這段記敘,為后世創(chuàng)造了“錦囊妙計”和“賠了夫人又折兵”兩個成語視頻:錦囊妙計.rm7面向?qū)ο笤O(shè)計149Command(命令)模式結(jié)構(gòu):7面向?qū)ο笤O(shè)計150Command(命令)模式分析錦囊是對命令的封裝諸葛亮是命令的設(shè)計者,他選擇趙云為接收者趙云同時又是命令的調(diào)用者,他依據(jù)實際情況決定何時調(diào)用、是否調(diào)用命令趙云作為命令的接收者,具體執(zhí)行這個命令在這個故事里,命令模式把命令的設(shè)計者諸葛亮、調(diào)用者趙云和執(zhí)行者趙云完全分割開。命令由諸葛亮設(shè)計并封裝,交由趙云調(diào)用,時機成熟時,趙云調(diào)用命令,再由自己去執(zhí)行之7面向?qū)ο笤O(shè)計151Command(命令)模式應(yīng)用舉例2:“玉帝傳美猴王上天”玉帝命令太白金星召美猴王上天:“金星徑入當(dāng)中,面南立定道:‘我是西方太白金星,奉玉帝招安圣旨,下界請你上天,拜受仙錄。’”玉帝的這一道命令就是要求猴王到上界報到。玉帝只管發(fā)出命令,而不管命令是怎樣傳達(dá)到美猴王的。太白金星負(fù)責(zé)將圣旨傳到,可是美猴王怎么執(zhí)行圣旨、何時執(zhí)行圣旨是美猴王自己的事。果不然,不久美猴王就大鬧了天宮7面向?qū)ο笤O(shè)計152Command(命令)模式結(jié)構(gòu)7面向?qū)ο笤O(shè)計153Command(命令)模式應(yīng)用舉例3:圖形界面7面向?qū)ο笤O(shè)計154好萊塢法則“Don’tcallus,we’llcallyou”本來是好萊塢的制片人拒絕演員時說的,意思是“別煩我,我想要你的時候會去找你的”(其實永遠(yuǎn)不會)這里是雙關(guān),指的是“調(diào)用”7面向?qū)ο笤O(shè)計155好萊塢法則回調(diào)(Callback)在框架中,框架知道何時去干一些事情,但不知道具體干什么客戶代碼知道干什么,但不知道何時去干這時候,客戶代碼傳給一個函數(shù)指針或者對象,由框架來決定何時調(diào)用7面向?qū)ο笤O(shè)計156好萊塢法則classButton{public: Button():action(0){}

voidsetAction(void(*act)()){ action=act;}

voidonClick(){(*action)();}private:

void(*action)();};7面向?qū)ο笤O(shè)計157TemplateMethod模板方法意圖定義一個操作中的算法的框架,而將一些步驟延遲到子類中。子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟7面向?qū)ο?/p>

溫馨提示

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

評論

0/150

提交評論