設(shè)計(jì)模式設(shè)計(jì)模式七大原則_第1頁(yè)
設(shè)計(jì)模式設(shè)計(jì)模式七大原則_第2頁(yè)
設(shè)計(jì)模式設(shè)計(jì)模式七大原則_第3頁(yè)
設(shè)計(jì)模式設(shè)計(jì)模式七大原則_第4頁(yè)
設(shè)計(jì)模式設(shè)計(jì)模式七大原則_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、設(shè)計(jì)模式021主要內(nèi)容設(shè)計(jì)模式準(zhǔn)備:7大設(shè)計(jì)原則2七大設(shè)計(jì)原則單一職責(zé)原則開-閉原則里氏代換原則依賴倒轉(zhuǎn)原則接口隔離原則合成/聚合復(fù)用原則迪米特原則3單一職責(zé)原則一個(gè)類只有一種職責(zé)SRP Single Responsibility Principle prinspl原則:若想到多于一個(gè)的動(dòng)機(jī)去改變一個(gè)類,那么這個(gè)類就具有多于一個(gè)的職責(zé)軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并且把職責(zé)相互分離為什么?高內(nèi)聚、低耦合、多復(fù)用4一個(gè)例子GameLogin()Exit()Left()Right()Fire()getUserName()getHighScore()5思考問題這個(gè)類中有幾個(gè)職責(zé)?用戶是否登

2、陸的方法跟用戶玩游戲的方法是否有關(guān)?獲得用戶信息跟其他兩個(gè)職責(zé)是否有關(guān)?如何優(yōu)化代碼?6優(yōu)化完成UML類圖userStateLogin()Exit()PlayLeft()Right()Fire()userInforgetUserName()getHighScore()內(nèi)聚高還是低?耦合度呢?7開-閉原則對(duì)擴(kuò)展開放、對(duì)更改封閉Open for extension Closed for modification開放-封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在做一個(gè)例子:寫個(gè)代碼片段:完成對(duì)兩個(gè)數(shù)字的加分和減法8開-閉原則大部分人的做法:若要添加乘法和除法呢?9開-閉原則OperaterGetResult(a

3、,b)減GetResult(a,b)加GetResult(a,b)符合開閉原則10里氏代換原則Barbara Liskow 在1988年發(fā)表的1972年Barbara成為麻省理工學(xué)院的教授是美國(guó)獲得計(jì)算機(jī)科學(xué)博士學(xué)位的第一人11里氏代換原則Liskow Substitution Principle (LSP):子類必須能夠替換掉它們的父類型只要是基類出現(xiàn)的地方,一定能夠出現(xiàn)子類!LSP指導(dǎo)繼承,是繼承的基石龍生龍,鳳生鳳,老鼠的兒子會(huì)打洞。12LSP例子:一個(gè)例子:長(zhǎng)方形和正方形某軟件 while(長(zhǎng)=寬),將寬+1.父類沒問題,但子類就回出現(xiàn)死循環(huán)正方形不可以繼承長(zhǎng)方形13LSP例子孫悟空勾

4、掉生死簿中所有猴子的名字,那么獼猴、石猴、長(zhǎng)臂猿等的名字是否都勾掉了?乘馬,乘白馬、乘驪馬注意LSP反之不成立!墨子 小取娣,美人也,愛娣,非愛美人也.盜,人也;惡盜,非惡人也 14一個(gè)例子15依賴虛線普通箭頭表示依賴依賴和關(guān)聯(lián)的區(qū)別A和B關(guān)聯(lián),A只認(rèn)識(shí)B,知道B的屬性和方法,可以雙關(guān)聯(lián),但不建議使用。A依賴BB的改變影響A的結(jié)果。通常依賴是單向的16如果父類的某些方法在子類中已經(jīng)發(fā)生畸變,則建議斷開父子關(guān)系!1718總結(jié)LSP拒絕子類有自己的個(gè)性一旦子類有了“個(gè)性”,則與父類之間的關(guān)系難以調(diào)和會(huì)讓代碼的耦合變得撲朔迷離19依賴倒轉(zhuǎn)原則要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。Program to a

5、n interface, not an implementation.高層模塊不應(yīng)該依賴底層模塊,兩者應(yīng)該都依賴抽象High-level module should not depend upon bottom module. both should depend upon abstractions20依賴倒轉(zhuǎn)原則減少類之間的耦合度降低風(fēng)險(xiǎn)一個(gè)例子司機(jī)開車Driverdriver(Benz bz)BenzRun()21依賴倒轉(zhuǎn)原則司機(jī)還要開寶馬,如何實(shí)現(xiàn)?增加寶馬類,但是需要修改司機(jī)類BMWRun()Driverdriver(Benz bz)driver(BMW bmw)BenzRun()22

6、如何解決針對(duì)接口編程23實(shí)現(xiàn)場(chǎng)景代碼:張三開奔馳IDriver 張3 = new Driver();ICar benz=new Benz();張3.driver(benz);24練習(xí)最初:光明農(nóng)場(chǎng)養(yǎng)牛擴(kuò)展:多種牛場(chǎng)、喂養(yǎng)多種動(dòng)物最初類圖如下,按照依賴倒轉(zhuǎn)原則畫出正確類圖光明農(nóng)場(chǎng)Feed(Cow c)Cow25接口隔離原則Interface Segregation Principle ISP客戶端不應(yīng)該依賴它不需要的方法類間的依賴關(guān)系應(yīng)該建立在最小的接口上 26一個(gè)例子一個(gè)接口:內(nèi)容是雇傭者有吃飯和做工作的方法雇傭的男、女都可以使用該接口有一天,雇傭者來(lái)了一個(gè)機(jī)器人。機(jī)器人不吃飯27例子 -錯(cuò)誤

7、Interface IWorkervoid eat();void work();Class Worker:IWorker public void eat ()/eat 相關(guān)代碼 public void work()/work相關(guān)代碼28ISP例子的缺陷胖接口,造成了對(duì)接口的污染如何解決?客戶端不應(yīng)該依賴它不需要的方法 類間的依賴關(guān)系應(yīng)該建立在最小的接口上 一個(gè)接口只做一件事29例子-符合ISPInterface IWorkerEat void eat();Interface IWorkerWorkvoid work();Class Worker:IWorkerEat,IWorkerWork p

8、ublic void eat ()/eat 相關(guān)代碼 public void work()/work相關(guān)代碼Class Robot:IWorkerWork public void work() /work相關(guān)代碼面向接口編程,而非實(shí)現(xiàn)編程30ISP胖接口容易導(dǎo)致啞方法瘦接口更健康!31合成/聚合復(fù)用原則Composite/Aggregate Reuse PrincipleCARP 合成和聚合合成是強(qiáng)烈的關(guān)聯(lián),部分(將)和整體(主)生命周期一樣,整體(主)對(duì)部分(將)有支配權(quán),包括創(chuàng)建和銷毀。聚合是部分和整體的普通關(guān)聯(lián)32合成和聚合劉邦和韓信33CARP原則合成: class Personpri

9、vate Hand hand; public Person() hand = new Hand(); 34CARP原則聚合: class Person private Computer computer; private A a; public setComputer() computer = new Computer(); public setA() a= new a(); 35CARP原則盡量使用合成/聚合,而不是使用繼承 繼承的優(yōu)點(diǎn)新的實(shí)現(xiàn)較為容易,因?yàn)榛惖拇蟛糠止δ芸梢酝ㄟ^(guò)繼承的關(guān)系自動(dòng)進(jìn)入子類。 修改和擴(kuò)展繼承而來(lái)的實(shí)現(xiàn)較為容易。繼承的缺點(diǎn)繼承將基類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類。稱“白箱”

10、復(fù)用。 如果基類發(fā)生改變,那么子類的實(shí)現(xiàn)也不得不發(fā)生改變。 多繼承不利于維護(hù)36CARP特點(diǎn)優(yōu)點(diǎn):依賴少,條條框框的限制少幾乎可以用到任何環(huán)境中容易實(shí)現(xiàn)修改和擴(kuò)展容易缺點(diǎn):對(duì)象多,需要管理37迪米特原則The Law of DemeterLoD不要和陌生人說(shuō)話又叫最少知識(shí)原則小國(guó)寡民,鄰國(guó)相望,雞犬之聲相聞,民至老死,不相往來(lái)38迪米特法則一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解,不和陌生人說(shuō)話最少知識(shí)、不相往來(lái)talk only to your immediate friends 建議多使用Private和Protect,而少使用public39迪米特法則40迪米特法則的優(yōu)點(diǎn)相當(dāng)弱的類耦合利于復(fù)用只要有可能類就可以設(shè)計(jì)成不變類41迪米特法則的缺點(diǎn)造成大量的小方法,散落在系統(tǒng)的各個(gè)角落這些方法僅僅是傳遞間接的調(diào)用容易引起第一次了解系統(tǒng)人的困惑42迪米特法則和設(shè)計(jì)模式Faade模式和Mediator模式都符合迪米特法則43總結(jié)泛化、依賴、關(guān)聯(lián)、聚合、組合泛化(繼承)class Aclass B : A依賴:class A public void Function(B b)class B 44關(guān)聯(lián)class A B b = new B();class B 聚合class A B b = new B(); C c = new C();class B clas

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論