UML學(xué)習(xí)PPT-21 面向?qū)ο笤O(shè)計(jì)原則_第1頁(yè)
UML學(xué)習(xí)PPT-21 面向?qū)ο笤O(shè)計(jì)原則_第2頁(yè)
UML學(xué)習(xí)PPT-21 面向?qū)ο笤O(shè)計(jì)原則_第3頁(yè)
UML學(xué)習(xí)PPT-21 面向?qū)ο笤O(shè)計(jì)原則_第4頁(yè)
UML學(xué)習(xí)PPT-21 面向?qū)ο笤O(shè)計(jì)原則_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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、面向?qū)ο笤O(shè)計(jì)原則面向?qū)ο笤O(shè)計(jì)原則n類設(shè)計(jì)n包設(shè)計(jì)面向?qū)ο笤O(shè)計(jì)原則類設(shè)計(jì) nSRP,單一職責(zé)原則,一個(gè)類應(yīng)該有且只有一個(gè)改變的理由 nOCP,開(kāi)放封閉原則,你應(yīng)該能夠不用修改原有類就能擴(kuò)展一個(gè)類的行為nLSP,Liskov替換原則,派生類要與其基類自相容nDIP,依賴倒置原則,依賴于抽象而不是實(shí)現(xiàn)nISP,接口隔離原則,客戶只要關(guān)注它們所需的接口nCARP,合成/聚合復(fù)用原則,盡量使用合成/聚合、盡量不要使用繼承nLoD,迪米特法則,不要和陌生人說(shuō)話單一職責(zé)原則(Single-Responsibility Principle )n就一個(gè)類而言,應(yīng)該只專注于做一件事和僅有一個(gè)引起它變化的原因 n所

2、謂職責(zé)n可以理解為功能,就是設(shè)計(jì)的這個(gè)類功能應(yīng)該只有一個(gè),而不是兩個(gè)或更多n也可以理解為引用變化的原因,當(dāng)你發(fā)現(xiàn)有兩個(gè)變化會(huì)要求我們修改這個(gè)類,那么你就要考慮拆分這個(gè)類了單一職責(zé)原則(Single-Responsibility Principle )n例子ninterface Modem public void dial(string pno); public void hangup(); public void send(char c); public void recv(); 單一職責(zé)原則(Single-Responsibility Principle )n例子ninterface Dat

3、aChannel public void send(char c); public void recv(); ninterface Connection public void dial(string pno); public void hangup();單一職責(zé)原則(Single-Responsibility Principle )n就像一個(gè)人身兼數(shù)職,而這些事情相互關(guān)聯(lián)不大,甚至有沖突,那他就無(wú)法很好的解決這些職責(zé),應(yīng)該分到不同的人身上去做才對(duì) n優(yōu)點(diǎn)n消除耦合,減小因需求變化引起代碼僵化性臭味 單一職責(zé)原則(Single-Responsibility Principle )n注意n一個(gè)合

4、理的類,應(yīng)該僅有一個(gè)引起它變化的原因,即單一職責(zé)n 在沒(méi)有變化征兆的情況下應(yīng)用SRP或其他原則是不明智的n 在需求實(shí)際發(fā)生變化時(shí)就應(yīng)該應(yīng)用SRP等原則來(lái)重構(gòu)代碼開(kāi)-閉原則(The Open-Closed Principle)n什么是開(kāi)-閉原則一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。n開(kāi)-閉原則的優(yōu)越性n通過(guò)擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對(duì)軟件的新需求n已有的軟件模塊不能再被修改,這使軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性開(kāi)-閉原則的關(guān)鍵抽象實(shí)現(xiàn)Open-Closed原則,抽象化是關(guān)鍵。 讓模塊操作一個(gè)抽象的實(shí)體。由于模塊依賴于一個(gè)固定的抽象實(shí)體,因此它可以是不允許被修改的;同時(shí),通過(guò)從這

5、個(gè)抽象體的派生,也可以擴(kuò)展此模塊的行為對(duì)可變性的封裝n考慮系統(tǒng)中什么可能會(huì)發(fā)生變化n一種可變性不應(yīng)當(dāng)散落到代碼的很多角落里,而應(yīng)該被封裝到一個(gè)對(duì)象里n開(kāi)閉原則具有理想主義的色彩,它是面向?qū)ο笤O(shè)計(jì)的終極目標(biāo)。 n里氏代換原則(LSP)、依賴倒轉(zhuǎn)原則(DIP)、接口隔離原則(ISP)以及抽象類(Abstract Class)、接口(Interace)等等,都可以看作是開(kāi)閉原則的實(shí)現(xiàn)方法。 里氏代換原則 (The Liskov Substitution Principle)n里氏代換原則的嚴(yán)格表達(dá)如果對(duì)每一個(gè)類型為T1的對(duì)象o1,都有類型為T2的對(duì)象o2,使得以T1定義的所有程序P在所有的對(duì)象o1都

6、代換成o2時(shí),程序P的行為沒(méi)有變化,那么類型T2是類型T1的子類型。n舉例對(duì)于父類和子類Base和Derived,若程序能接受Base,那么程序必然可以接受子類Derivedvoid Method (Base b); Derived d;Method (d);里氏代換原則 (The Liskov Substitution Principle)依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)糟糕的設(shè)計(jì)n很難添加新的功能,因?yàn)槊恳惶幐膭?dòng)都會(huì)影響系統(tǒng)中過(guò)多的模塊n當(dāng)你做了一處改動(dòng),卻導(dǎo)致系統(tǒng)中的另一個(gè)模塊發(fā)生問(wèn)題n很難在別的應(yīng)用程序中重用這個(gè)模塊三種耦合關(guān)系n零耦合(Ni

7、l Coupling)兩個(gè)類之間沒(méi)有耦合關(guān)系n具體耦合(Concrete Coupling)兩個(gè)具體的類之間,經(jīng)由一個(gè)類對(duì)另一個(gè)具體類的直接引用造成的耦合關(guān)系n抽象耦合(Abstract Coupling)一個(gè)具體類和一個(gè)抽象類(或接口)之間的耦合關(guān)系具體耦合的例子抽象耦合的例子依賴倒轉(zhuǎn)原則n高層模塊不應(yīng)依賴于低層模塊。二者都應(yīng)該依賴于抽象。n抽象不應(yīng)當(dāng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象n要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程依賴倒轉(zhuǎn)原則的不足n導(dǎo)致大量的類出現(xiàn),不容易實(shí)現(xiàn)n依賴倒轉(zhuǎn)原則假定所有的具體類都是會(huì)變化的,這一點(diǎn)并不總是正確的接口隔離原則 (Interface Segregation Prin

8、ciple)n接口的污染(Interface Contamination)一些沒(méi)有經(jīng)驗(yàn)的設(shè)計(jì)師往往想節(jié)省接口的數(shù)量,將一些功能相近或功能相關(guān)的接口合并,并將這看成是代碼優(yōu)化的一部分。接口隔離原則n接口隔離原則(ISP)一個(gè)類對(duì)另外一個(gè)類的依賴應(yīng)當(dāng)是建立在最小的接口上的。換言之,使用多個(gè)專門的接口比使用單一的總接口要好。接口隔離原則例子接口隔離原則例子合成/聚合復(fù)用原則 (Composite/ Aggregate Reuse Principle)n定義:在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新的對(duì)象通過(guò)向這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的n簡(jiǎn)單表述:代碼復(fù)用的時(shí)候要盡量

9、的使用合成/聚合,盡量不要使用繼承復(fù)用技術(shù)繼承n優(yōu)點(diǎn)n新的實(shí)現(xiàn)較為容易n修改或擴(kuò)展繼承而來(lái)的實(shí)現(xiàn)較為容易n缺點(diǎn)n繼承復(fù)用破壞封裝n如果超類發(fā)生改變,那么子類的實(shí)現(xiàn)不得不改變n從超類繼承而來(lái)的實(shí)現(xiàn)是靜態(tài)的,不能在運(yùn)行時(shí)間內(nèi)發(fā)生改變復(fù)用技術(shù)合成/聚合n優(yōu)點(diǎn)n新對(duì)象與引用對(duì)象溝通的唯一方法是被引用對(duì)象的接口,這樣保持了封裝性n這種復(fù)用在運(yùn)行時(shí)刻動(dòng)態(tài)進(jìn)行n缺點(diǎn)n有較多的對(duì)象需要管理迪米特法則(Law of Demeter)n迪米特法則(LoD)又叫最少知識(shí)原則:n一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用n每一個(gè)軟件單位對(duì)其他的單位都只有最少的知識(shí),而且局限于那些與本單位密切相關(guān)的軟件單位。n門

10、面模式(Facade)和中介模式(Mediator),都是迪米特法則應(yīng)用的例子狹義的迪米特法則n如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個(gè)類需要調(diào)用另外一個(gè)類的某一個(gè)方法,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。弊端n系統(tǒng)中存在大量的中介類,這些類之所以存在完全是為了傳遞類之間的相互調(diào)用關(guān)系這在一定程度上增加了系統(tǒng)的復(fù)雜度n解決辦法n遵循依賴倒換原則做些折衷處理,讓對(duì)象依賴于抽象層,降低耦合例子nSomeone、Friend和Stranger三個(gè)類例子nSomeone類有一個(gè)方法接受一個(gè)Friend類型的變量 npublic class Someone public

11、 void operation1( Friend friend ) Stranger stranger = vide() ; stranger.operation3() ; 例子nSomeone和Friend是朋友類(直接通訊的類)。Friend類持有一個(gè)Stranger類的私有對(duì)象,他們是朋友類:n public class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; 例子nS

12、omeone類和Stranger類不是朋友類,但Someone類卻通過(guò)Friend類知道了Stranger類的存在,這顯然違反迪米特法則。 例子n對(duì)Someone和Friend類進(jìn)行重構(gòu) npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public Stranger provide() return stranger ; public void forward() stranger.operation3() ; 例子n重構(gòu)Someone的operation1方法

13、,讓其調(diào)用新提供的forward方法 npublic class Someone public void operation1( Friend friend ) friend.forward() ; 例子n現(xiàn)在Someone對(duì)Stranger的依賴完全通過(guò)Friend隔離,這樣的結(jié)構(gòu)已經(jīng)符合狹義迪米特法則了。 n缺點(diǎn):會(huì)在系統(tǒng)里造出大量的小方法,散落在系統(tǒng)的各個(gè)角落。n遵循迪米特法則會(huì)使一個(gè)系統(tǒng)的局部設(shè)計(jì)簡(jiǎn)化,因?yàn)槊恳粋€(gè)局部都不會(huì)和遠(yuǎn)距離的對(duì)象有直接關(guān)聯(lián)。但是,這也會(huì)造成系統(tǒng)的不同模塊之間的通信效率降低,也會(huì)使系統(tǒng)的不同模塊之間不容易協(xié)調(diào)。 例子n結(jié)合依賴倒轉(zhuǎn)原則,重構(gòu)代碼n添加一個(gè)抽象的Ab

14、stractStranger類,使Someone依賴于抽象的“AbstractStranger”角色,而不是具體實(shí)現(xiàn) npublic abstract class AbstractStranger abstract void operation3() ; 例子n讓Stranger從AbstractStranger類繼承npublic class Stranger extends AbstractStranger public void operation3() 例子n重構(gòu)Someone使其依賴抽象的AbstractStrangernpublic class Someone public voi

15、d operation1( Friend friend ) AbstractStranger stranger = vide() ; stranger.operation3() ; 例子n重構(gòu)Friend的provide方法,使其返回抽象角色 npublic class Friend private Stranger stranger = new Stranger() ; public void operation2() public AbstractStranger provide() return stranger ; 例子nAbstractStranger成為Some

16、one的朋友類,而Friend類可以隨時(shí)替換掉AbstractStranger的實(shí)現(xiàn)類,Someone不再需要了解Stranger的內(nèi)部實(shí)現(xiàn)細(xì)節(jié) 廣義迪米特法則 n將迪米特法則運(yùn)用到系統(tǒng)的設(shè)計(jì)中時(shí),應(yīng)注意:n在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類n在類的設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低成員的訪問(wèn)權(quán)限n在類的設(shè)計(jì)上,只要有可能,一個(gè)類應(yīng)當(dāng)設(shè)計(jì)成不變類n一個(gè)對(duì)象對(duì)其它對(duì)象的引用應(yīng)當(dāng)降到最低n盡量降低類的訪問(wèn)權(quán)限n不要暴露類成員,而應(yīng)該提供相應(yīng)的訪問(wèn)器面向?qū)ο笤O(shè)計(jì)原則包設(shè)計(jì)nREP,重用等價(jià)原則,重用的粒度就是發(fā)布的粒度 nCCP,共同封閉原則,包中的所有類對(duì)于同一類性質(zhì)的變化應(yīng)該是共同封閉的 nCRP,共

17、同重用原則,一個(gè)包中的所有類應(yīng)該是共同重用的 nADP,無(wú)環(huán)依賴原則,在包的依賴關(guān)系圖中不允許存在環(huán) nSDP,穩(wěn)定依賴原則,朝著穩(wěn)定的方向進(jìn)行依賴 nSAP,穩(wěn)定抽象原則,包的抽象程度應(yīng)該和其穩(wěn)定程度一致 n重用等價(jià)原則(REP)指的是把類放入包中時(shí),應(yīng)考慮把包作為可重用的單元。n這種設(shè)計(jì)原則和用戶的使用心理有關(guān),對(duì)于可重用的類,其開(kāi)發(fā)可能比較快,開(kāi)發(fā)人員會(huì)不斷地推出這些可重用類的升級(jí)版本,但對(duì)于可重用類的使用者來(lái)說(shuō),不會(huì)隨著可重用類的每次升級(jí)而修改自己的系統(tǒng),不過(guò),在需要升級(jí)的時(shí)候又會(huì)要求很容易地用新版本的可重用類替換舊版本的可重用類,因此設(shè)計(jì)包的一個(gè)原則是把類放在包中時(shí)要方便重用,方便對(duì)

18、這個(gè)包的各個(gè)版本的管理。 n共同閉包原則(CCP)指的是把那些需要同時(shí)改變的類放在一個(gè)包中。n例如,如果一個(gè)類的行為和/或結(jié)構(gòu)的改變要求另一個(gè)類作相應(yīng)的改變,則這兩個(gè)類應(yīng)放在一個(gè)包中;或者在刪除了一個(gè)類后,另一個(gè)類變成多余的,則這兩個(gè)類應(yīng)放在一個(gè)包中;或者兩個(gè)類之間有大量的消息發(fā)送,則這兩個(gè)類也應(yīng)放在一個(gè)包中。n共同閉包原則就是要提高包的內(nèi)聚性、降低包與包之間的耦合度,希望在改動(dòng)或升級(jí)一個(gè)包的時(shí)候要盡量少影響別的包。n共同重用原則(CRP)指的是不會(huì)一起使用的類不要放在同一包中。n這個(gè)原則和包的依賴關(guān)系有關(guān)。如果元素A依賴于包P中的某個(gè)元素,則表示A會(huì)依賴于P中的所有元素。也就是說(shuō),包P中的任何一個(gè)元素做了修改,則

溫馨提示

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

評(píng)論

0/150

提交評(píng)論