![設(shè)計(jì)模式六大原則_第1頁(yè)](http://file4.renrendoc.com/view/080e6e5c96f8df335340bd8d64e0dc16/080e6e5c96f8df335340bd8d64e0dc161.gif)
![設(shè)計(jì)模式六大原則_第2頁(yè)](http://file4.renrendoc.com/view/080e6e5c96f8df335340bd8d64e0dc16/080e6e5c96f8df335340bd8d64e0dc162.gif)
![設(shè)計(jì)模式六大原則_第3頁(yè)](http://file4.renrendoc.com/view/080e6e5c96f8df335340bd8d64e0dc16/080e6e5c96f8df335340bd8d64e0dc163.gif)
![設(shè)計(jì)模式六大原則_第4頁(yè)](http://file4.renrendoc.com/view/080e6e5c96f8df335340bd8d64e0dc16/080e6e5c96f8df335340bd8d64e0dc164.gif)
![設(shè)計(jì)模式六大原則_第5頁(yè)](http://file4.renrendoc.com/view/080e6e5c96f8df335340bd8d64e0dc16/080e6e5c96f8df335340bd8d64e0dc165.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)計(jì)模式六大原作者:zhengzhb發(fā)布于2012-11-2,:設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原問(wèn)題T個(gè)不同的職責(zé):職責(zé)P1,P2。當(dāng)由于職責(zé)P1求發(fā)生改變而需要修改T可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2能發(fā)生故障。解決方案:遵循單一職責(zé)原則。分別建立兩T1、T2,T1P1,T2成職責(zé)P2當(dāng)修改類T1會(huì)使P2生故障風(fēng)險(xiǎn);同理,當(dāng)修改T2不會(huì)使職責(zé)P1風(fēng)險(xiǎn)。設(shè)模式從沒(méi)有單職責(zé)則在軟件也自覺(jué)遵這一要?jiǎng)t為這。在件程中誰(shuí)不望因修了功能致他的能生故。避現(xiàn)這問(wèn)的方便遵循一責(zé)則。然一原則此單,且認(rèn)為,PP1和P2。比如T負(fù)責(zé)一個(gè)職責(zé)P,這樣設(shè)計(jì)是符合單一職責(zé)原則的。后來(lái)由于某種原因,也許是需求變更了,也許是程序的設(shè)計(jì)者境界提高了,需要將職P粒度更細(xì)的職責(zé)P1,P2,這時(shí)如果要使程序遵循單一職T解為兩個(gè)類T1T2,分別負(fù)責(zé)P1、P2個(gè)職責(zé)。但是在程序已經(jīng)寫(xiě)好的情況下,這樣做簡(jiǎn)直太費(fèi)時(shí)間了。所以,簡(jiǎn)單的修改類T,用它來(lái)負(fù)散的不確定性,因?yàn)槲覀儾粫?huì)想到這個(gè)職責(zé)P,在未來(lái)可能會(huì)擴(kuò)P1,P2,P3,P4……Pn。所以舉例說(shuō)明,用一個(gè)類描述動(dòng)物呼吸這個(gè)場(chǎng)景mal{publicvoidbreathe(Stringystem.out.println(animal+}}publicublicstaticvoidmain(String[]Animalanimal=animal.breathe("animal.breathe("豬 }豬呼AimalTerestralAuatc,publicvoidbreathe(Stringystem.out.println(animal+"呼吸空氣 }class the(String public System.out.println(animal+publicstaticvoidmain(String[]errestrialterrestrial=newerrestrial.breathe(" aquatic.breathe("terrestrial.breathe(Aquaticaquatic 直接修改類Animal然違背了單一職責(zé)原則,但花銷卻小的多,代碼如下:classAnimal{publicvoidbreathe(String if(" public publicstaticvoidAnimalanimal=newanimal.breathe(animal.breathe(animal.breathe("魚(yú) }animal.breathe("Anialbrathemal{publicvoidbreathe(Stringanimal){ publicvoidStringanimal){ publicclass publicstaticvoidmain(String[]nimalanimal=newanimal.breathe("nimal.breathe("animal.breathe("nimal.breathe2("}情況確。我原是:有輯夠簡(jiǎn),可代碼別一責(zé)原;有遵循單一職責(zé)原的優(yōu)點(diǎn)有設(shè)計(jì)模式六大原則(2):里氏替換原這項(xiàng)原則最早是在1988年,由麻省理工學(xué)院的一位姓里的(BarbaraLiskov)提出來(lái)的。定義1:如果對(duì)每一個(gè)類型為T1對(duì)象o1,都有類型為T2o2,使得以T1義的所有P有的o1代換成o2程序P行為沒(méi)有發(fā)生變化,那么類型T2型T1的子類型。問(wèn)題由來(lái):有能P1,由類A完成?,F(xiàn)需要將功能P1進(jìn)行擴(kuò)展,擴(kuò)展后的功能為P,其中PP1P2功能PAB則B完P(guān)2的同時(shí),有可能會(huì)導(dǎo)致原有P1解決方案:當(dāng)使用繼承時(shí),遵循里氏替換原則。類B承A添加新的方法完成新增功能P2不要A方法,也盡量不要重載父類A法。舉例說(shuō)明繼承的風(fēng)險(xiǎn),我們需要完成一個(gè)兩數(shù)相減的功能,由類A負(fù)責(zé)publicintfunc1(inta,intpublicintfunc1(inta,intreturna- public publicstaticvoidmain(String[]a=new System.out.println("100-80="+a.func1(100, }運(yùn)行結(jié)果100-100-后來(lái),我們需要增加一個(gè)新的功能:完成兩數(shù)相加,然后再與100和B負(fù)責(zé)。即B成兩個(gè)功能:由于類A經(jīng)實(shí)現(xiàn)了第一個(gè)BA,只需要再完成第二個(gè)功能就可以xtendsxtendspublicintfunc1(inta,intpublicintfunc2(inta,intreturn public Bb=newnc1(100,publicstaticvoidSystem.out.println("100-System.out.println("100+20+100="+b.func2(100,20));}100-100-我們發(fā)現(xiàn)原本運(yùn)行正常的相減功能發(fā)生了錯(cuò)誤。原因就是B法起名時(shí)無(wú)意中重寫(xiě)了父類的方法,造成所有運(yùn)行相減功能的代碼全部調(diào)用了類B后的方法,造成原本運(yùn)行正常的功能出現(xiàn)了錯(cuò)誤。在本例中,基類A完成的功能,換成子類B之后,發(fā)生了異常。在實(shí)際編程包含4含義:設(shè)計(jì)模式六大原則(3):依賴倒置原問(wèn)題A賴類B,假如要將類AC,則必須通過(guò)修A代碼來(lái)達(dá)成。這種場(chǎng)景下,類A一般是模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;假A,會(huì)給程序帶來(lái)不必要的風(fēng)險(xiǎn)。解決方案:將類A為依賴接口IBC自實(shí)現(xiàn)接口I,類AI與BC則會(huì)大大降低修改類A率ava依賴置則的想是向口程,們舊個(gè)例來(lái)明面接編程相對(duì)publicreturn voidnarrate(Bookystem.out.println("開(kāi)始講故事}}publicclassublicstaticvoidmain(String[]Mothermother=mother.narrate(new}}運(yùn)行結(jié)果publicString}return要改Moter能。如以需換換成頁(yè)?還不地改Moter,Mther與Bok才行。象的接口interfaceinterface publicStringgetContent();Mother接口IReader生依賴關(guān)系,而B(niǎo)ookNewspaper讀物的范疇,他們各自都去IReader這樣就符合依賴倒置原則了,代碼修改為:spaperimplementsIReader{publicStringgetContent(){ 助尼克斯擊敗老鷹……";}}classBookimplementsIReader{pu return"很久很久以前有一個(gè)的故事……";}classMother{publicvoidnarrate(IReaderystem.out.println("開(kāi)始講故事}}publicclassublicstaticvoidmain(String[]Mothermother=mother.narrate(new()); 運(yùn)行結(jié)果林書(shū)豪17+9克斯這樣改,無(wú)以怎樣展類都需要改Moter了這只一簡(jiǎn)單的例,際情中代表塊的Mothr將負(fù)成主的務(wù)邏,旦需對(duì)進(jìn)采用依賴倒置原則給多人并行開(kāi)發(fā)帶來(lái)了極大的便利,比如上例中,原本Mother與Book類直接耦合時(shí),Mother須等Book編碼完成后才可以進(jìn)行編碼,因?yàn)镸other賴于Book類。修改后的程序則可以同時(shí)開(kāi)工,互不影MotherBook一點(diǎn)關(guān)系也沒(méi)有。參與協(xié)作開(kāi)發(fā)的人越多、項(xiàng)目越龐大,采用依賴導(dǎo)致原則的意義就越重大?,F(xiàn)在很流行的TDD是構(gòu)造方法傳遞和setter相信用過(guò)Spring架的,對(duì)依賴的傳遞方式一定不會(huì)陌生在實(shí)際編程中,我們一般需要做到如下3依賴倒置原則的就是要我們面向接口編程,理解了面向接口編程,也就理解了依賴置設(shè)計(jì)模式六大原則(4):接口原上問(wèn)題AIBCI賴D,如果IAB不是最小接口B類D現(xiàn)他們不需要的方法。解決方案:將臃I的幾個(gè)接口,類A類C與他們需要的接口建立依賴關(guān)系。也就是采用接口原則。舉例來(lái)說(shuō)明接口原則(圖1未遵循接口原則的設(shè)計(jì)這個(gè)圖的意思是A賴I方法12、方3B是對(duì)類A賴的實(shí)現(xiàn)。類CI1、方法4、5,類DC的實(shí)現(xiàn)。對(duì)于類B和類D說(shuō),I{I{publicvoid publicvoidpublicvoidpublic; class publicvoiddepend1(I publicvoiddepend2(Ii){ voiddepend3(Ii){ classBimplementsI{publicvoidmethod1(){ System.out.println("類B實(shí)現(xiàn)接口I的方法 publicvoidmethod2(){ System.out.println("類B實(shí)現(xiàn)接口I的方法2"); publicvoidmethod3(){ System.out.println("類B實(shí)現(xiàn)接口I的方法3");} //對(duì)于類B來(lái)說(shuō),method4和method5不是必需的,但是由于接口A中有這兩個(gè)方法, publicvoid classpublic}publicvoiddepend2(Ii){ publicvoiddepend3(Ii){ classDimplementsI{ voidmethod1(){ System.out.println("DI1"); //對(duì)于類D來(lái)說(shuō),method2和method3不是必需的,但是由于接口A中有這兩個(gè) publicvoidmethod2(){} publicvoidmethod3(){} voidmethod4(){ System.out.println("類D實(shí)現(xiàn)接口I的方法4"); publicvoidmethod5() System.out.println(DI的方法5"); publicclass publicstaticvoidmain(String[] Aa=newA(); a.depend1(newB());a.depend2(new a.depend3(new c=newC(); c.depend1(newD()); c.depend2(newD());c.depend3(newD()); }}中必須實(shí)這些法這然不好設(shè)如果這設(shè)計(jì)改符合口原則,必對(duì)接口I行拆。這原的口I拆為三接,分后設(shè)如圖所示:(圖2遵循接口原則的設(shè)計(jì)照例貼出程序的代碼,供不熟悉類圖的朋友參考eI1eI1;publicvoidmethod1();interfaceI2 publicpublicvoid}interfaceI3publicvoidublicvoidmethod5(); class publicvoiddepend1(I1 publicvoiddepend2(I2i){ publicvoiddepend3(I2 sI1,1publicvoidmethod1()}publicvoidmethod2()ystem.out.println("類B實(shí)現(xiàn)接口I2的方法 public{}System.out.println(BI2classpublicvoiddepend1(I1publicvoiddepend2(I3 nd3(I3i){ classDimplementsI1,Iublicvoidmethod1() System.out.println("D}3publicvoidmethod4()}publicvoidmethod5()ystem.out.println("類D實(shí)現(xiàn)接口I3的方法 }II接口則的義:建單接,不建龐腫的口盡量化口,口中的方盡少。就說(shuō),們?yōu)閭€(gè)類立口,不試圖建一個(gè)龐的供所依它的去用。文子,將個(gè)大口變?yōu)?個(gè)的口所用就口原。在序計(jì)中依幾接要賴一綜的接更活。口設(shè)可性。說(shuō)到里很多會(huì)的接原跟之的一原則相,其不。其,單一職原原注的職責(zé)而口原注對(duì)依賴。其,一職原主約束,次才接和方,針的是序的和細(xì);接口則主約接設(shè)計(jì)模式六大原則(5)迪米特法則又叫最少知道原則,最早是在1987年由NortheasternUniversity的IanHolland來(lái)講,就是一個(gè)類對(duì)自己依賴的類知道的越少越好。也就是說(shuō),對(duì)于被依賴的類來(lái)說(shuō),無(wú)論邏輯多么復(fù)雜,都盡量地的將邏輯封裝在類的內(nèi)部,對(duì)外除了提供的public員工classthis.id=id;privateString publicvoidpublicString classthis.id=privateStringd(Stringreturn}publicString 員工classthis.id=id;privateString publicvoidpublicString classthis.id=privateStringd(Stringreturn}publicString mployee> List<SubEmployee>list= for(inti=0;i<100;ubEmployeeemp=newist<Employee>list=newEmployeeemp=newfor(intublicvoidemp.setId("總公司}returnpanyManager}ist<SubEmployee>list1= }return} publicList<Employee>list2=List<Employee>list2= }publicManagere= publicstaticvoidmain(String[] }}}現(xiàn)在這個(gè)設(shè)計(jì)的主要問(wèn)題出在Manager中,根據(jù)迪米特法則,只與直接的朋友發(fā)生通信,而SubEmployee類并不是Manager類
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 線上互動(dòng)公關(guān)合同(2篇)
- 繼承人財(cái)產(chǎn)分割協(xié)議書(shū)(2篇)
- 物品申請(qǐng)書(shū) 范文
- 7.2 10000以內(nèi)數(shù)的認(rèn)識(shí) 二年級(jí)下冊(cè)數(shù)學(xué)同步練習(xí)(含答案)
- 生產(chǎn)流程中的數(shù)據(jù)驅(qū)動(dòng)決策與創(chuàng)新
- 外研版高中英語(yǔ)選擇性必修第四冊(cè)UNIT1 Period6課件
- 車間班長(zhǎng)申請(qǐng)書(shū)
- Module10練習(xí)(單元測(cè)試)-英語(yǔ)三年級(jí)下冊(cè)-外研版(一起)(含答案)
- Module9練習(xí)(單元測(cè)試)-英語(yǔ)三年級(jí)下冊(cè)-外研版(一起)(含答案)
- 2022年11月軟考網(wǎng)絡(luò)工程師上午真題
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設(shè)備結(jié)構(gòu)認(rèn)知
- 2023年北京高考政治真題試題及答案
- 復(fù)旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術(shù)
- 五年級(jí)上冊(cè)數(shù)學(xué)《比的應(yīng)用》專項(xiàng)訓(xùn)練課件
- 北師大版五年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件第5課時(shí) 人民幣兌換
- 工程回訪記錄單
- 住房公積金投訴申請(qǐng)書(shū)
- 外研版英語(yǔ)五年級(jí)下冊(cè)第一單元全部試題
- 檢驗(yàn)科生物安全風(fēng)險(xiǎn)評(píng)估報(bào)告
- 京頤得移動(dòng)門診產(chǎn)品輸液
評(píng)論
0/150
提交評(píng)論