面向?qū)ο笤O(shè)計(jì)原則(java)詳解講解學(xué)習(xí)_第1頁(yè)
面向?qū)ο笤O(shè)計(jì)原則(java)詳解講解學(xué)習(xí)_第2頁(yè)
面向?qū)ο笤O(shè)計(jì)原則(java)詳解講解學(xué)習(xí)_第3頁(yè)
面向?qū)ο笤O(shè)計(jì)原則(java)詳解講解學(xué)習(xí)_第4頁(yè)
面向?qū)ο笤O(shè)計(jì)原則(java)詳解講解學(xué)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(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ì)原則(Java)詳解Page 2面向?qū)ο笤O(shè)計(jì)原則概述w 軟件的可維護(hù)性和可復(fù)用性F知名軟件大師知名軟件大師Robert C.Martin認(rèn)為一個(gè)可維護(hù)性較低認(rèn)為一個(gè)可維護(hù)性較低的軟件設(shè)計(jì),通常由于如下四個(gè)原因造成:的軟件設(shè)計(jì),通常由于如下四個(gè)原因造成: 過(guò)于僵硬(Rigidity) 過(guò)于脆弱(Fragility) 復(fù)用率低(Immobility) 黏度過(guò)高(Viscosity) Robert C.MartinPage 3面向?qū)ο笤O(shè)計(jì)原則概述w 軟件的可維護(hù)性和可復(fù)用性F軟件工程和建模大師軟件工程和建模大師Peter Coad認(rèn)為,一個(gè)好的系統(tǒng)認(rèn)為,一個(gè)好的系統(tǒng)設(shè)計(jì)應(yīng)該具備如下三個(gè)性

2、質(zhì):設(shè)計(jì)應(yīng)該具備如下三個(gè)性質(zhì): 可擴(kuò)展性(Extensibility) 靈活性(Flexibility) 可插入性(Pluggability) Peter CoadPage 4面向?qū)ο笤O(shè)計(jì)原則概述w 軟件的可維護(hù)性和可復(fù)用性F 軟件的復(fù)用軟件的復(fù)用(Reuse)或重用或重用擁有眾多優(yōu)點(diǎn),如可以提高軟件擁有眾多優(yōu)點(diǎn),如可以提高軟件的開(kāi)發(fā)效率,提高軟件質(zhì)量,節(jié)約開(kāi)發(fā)成本,的開(kāi)發(fā)效率,提高軟件質(zhì)量,節(jié)約開(kāi)發(fā)成本,恰當(dāng)?shù)膹?fù)用還恰當(dāng)?shù)膹?fù)用還可以改善系統(tǒng)的可維護(hù)性可以改善系統(tǒng)的可維護(hù)性。F面向?qū)ο笤O(shè)計(jì)復(fù)用的目標(biāo)在于面向?qū)ο笤O(shè)計(jì)復(fù)用的目標(biāo)在于實(shí)現(xiàn)支持可維護(hù)性的復(fù)用。實(shí)現(xiàn)支持可維護(hù)性的復(fù)用。 F在面向?qū)ο蟮脑O(shè)

3、計(jì)里面,在面向?qū)ο蟮脑O(shè)計(jì)里面,可維護(hù)性復(fù)用都是以面向?qū)ο笤O(shè)計(jì)可維護(hù)性復(fù)用都是以面向?qū)ο笤O(shè)計(jì)原則為基礎(chǔ)的原則為基礎(chǔ)的,這些設(shè)計(jì)原則首先都是復(fù)用的原則,遵循這,這些設(shè)計(jì)原則首先都是復(fù)用的原則,遵循這些設(shè)計(jì)原則可以有效地提高系統(tǒng)的復(fù)用性,同時(shí)提高系統(tǒng)的些設(shè)計(jì)原則可以有效地提高系統(tǒng)的復(fù)用性,同時(shí)提高系統(tǒng)的可維護(hù)性。可維護(hù)性。 Page 5面向?qū)ο笤O(shè)計(jì)原則概述w 軟件的可維護(hù)性和可復(fù)用性F面向?qū)ο笤O(shè)計(jì)原則和設(shè)計(jì)模式也是對(duì)系統(tǒng)進(jìn)行合理重構(gòu)面向?qū)ο笤O(shè)計(jì)原則和設(shè)計(jì)模式也是對(duì)系統(tǒng)進(jìn)行合理重構(gòu)的指南針,的指南針,重構(gòu)重構(gòu)(Refactoring)是是在不改變軟件現(xiàn)有功能在不改變軟件現(xiàn)有功能的基礎(chǔ)上,通過(guò)調(diào)整程序代

4、碼改善軟件的質(zhì)量、性能,的基礎(chǔ)上,通過(guò)調(diào)整程序代碼改善軟件的質(zhì)量、性能,使其程序的設(shè)計(jì)模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展使其程序的設(shè)計(jì)模式和架構(gòu)更趨合理,提高軟件的擴(kuò)展性和維護(hù)性性和維護(hù)性。 Martin FowlerPage 6面向?qū)ο笤O(shè)計(jì)原則概述w 面向?qū)ο笤O(shè)計(jì)原則簡(jiǎn)介 F常用的面向?qū)ο笤O(shè)計(jì)原則包括七個(gè),這些原則并不是孤立存在的,它們相互依賴,相互補(bǔ)充。設(shè)計(jì)原則名稱設(shè)計(jì)原則名稱設(shè)計(jì)原則簡(jiǎn)介設(shè)計(jì)原則簡(jiǎn)介重要性重要性單一職責(zé)原則(Single Responsibility Principle, SRP)類(lèi)的職責(zé)要單一,不能將太多的職責(zé)放在一個(gè)類(lèi)中。開(kāi)閉原則(Open-Closed Princi

5、ple, OCP)軟件實(shí)體對(duì)擴(kuò)展是開(kāi)放的,但對(duì)修改是關(guān)閉的,即在不修改一個(gè)軟件實(shí)體的基礎(chǔ)上去擴(kuò)展其功能。里氏代換原則(Liskov Substitution Principle, LSP)在軟件系統(tǒng)中,一個(gè)可以接受基類(lèi)對(duì)象的地方必然可以接受一個(gè)子類(lèi)對(duì)象。依賴倒轉(zhuǎn)原則(Dependency Inversion Principle, DIP)要針對(duì)抽象層編程,而不要針對(duì)具體類(lèi)編程。接口隔離原則(Interface Segregation Principle, ISP)使用多個(gè)專(zhuān)門(mén)的接口來(lái)取代一個(gè)統(tǒng)一的接口。 合成復(fù)用原則(Composite Reuse Principle, CRP)在系統(tǒng)中應(yīng)該盡

6、量多使用組合和聚合關(guān)聯(lián)關(guān)系,盡量少使用甚至不使用繼承關(guān)系。迪米特法則(Law of Demeter, LoD)一個(gè)軟件實(shí)體對(duì)其他實(shí)體的引用越少越好,或者說(shuō)如果兩個(gè)類(lèi)不必彼此直接通信,那么這兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用,而是通過(guò)引入一個(gè)第三者發(fā)生間接交互。Page 7單一職責(zé)原則 w 單一職責(zé)原則定義F單一職責(zé)原則單一職責(zé)原則(Single Responsibility Principle, SRP)定義如下:定義如下: 在軟件系統(tǒng)中,一個(gè)類(lèi)只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)。F另一種定義方式如下:另一種定義方式如下: 就一個(gè)類(lèi)而言,應(yīng)該僅有一個(gè)引起它變化的原因。 Page 8單一職責(zé)原則 w

7、單一職責(zé)原則分析 F一個(gè)類(lèi)(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被一個(gè)類(lèi)(或者大到模塊,小到方法)承擔(dān)的職責(zé)越多,它被復(fù)用的可能性越小復(fù)用的可能性越小。而且如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,就相。而且如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,就相當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個(gè)職責(zé)變化時(shí),可能當(dāng)于將這些職責(zé)耦合在一起,當(dāng)其中一個(gè)職責(zé)變化時(shí),可能會(huì)影響其他職責(zé)的運(yùn)作。會(huì)影響其他職責(zé)的運(yùn)作。 F類(lèi)的職責(zé)主要包括兩個(gè)方面:類(lèi)的職責(zé)主要包括兩個(gè)方面:數(shù)據(jù)職責(zé)和行為職責(zé)數(shù)據(jù)職責(zé)和行為職責(zé),數(shù)據(jù)職,數(shù)據(jù)職責(zé)通過(guò)其屬性來(lái)體現(xiàn),而行為職責(zé)通過(guò)其方法來(lái)體現(xiàn)。責(zé)通過(guò)其屬性來(lái)體現(xiàn),而行為職責(zé)通過(guò)其方法來(lái)體現(xiàn)。F單一職責(zé)原則是實(shí)現(xiàn)

8、單一職責(zé)原則是實(shí)現(xiàn)高內(nèi)聚、低耦合高內(nèi)聚、低耦合的指導(dǎo)方針,在很多代的指導(dǎo)方針,在很多代碼重構(gòu)手法中都能找到它的存在,它是最簡(jiǎn)單但又最難運(yùn)用碼重構(gòu)手法中都能找到它的存在,它是最簡(jiǎn)單但又最難運(yùn)用的原則,需要設(shè)計(jì)人員發(fā)現(xiàn)類(lèi)的不同職責(zé)并將其分離,而發(fā)的原則,需要設(shè)計(jì)人員發(fā)現(xiàn)類(lèi)的不同職責(zé)并將其分離,而發(fā)現(xiàn)類(lèi)的多重職責(zé)需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相現(xiàn)類(lèi)的多重職責(zé)需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn)。關(guān)重構(gòu)經(jīng)驗(yàn)。Page 9單一職責(zé)原則 w 單一職責(zé)原則實(shí)例 F實(shí)例說(shuō)明實(shí)例說(shuō)明 某基于Java的C/S系統(tǒng)的“登錄功能”通過(guò)如下登錄類(lèi)(Login)實(shí)現(xiàn): 現(xiàn)使用單一職責(zé)原則對(duì)其進(jìn)行重構(gòu)。L

9、ogin+init ()display ()validate ()getConnection ()findUser (String userName, String userPassword)main (String args): void: void: void: Connection: boolean: voidPage 10單一職責(zé)原則 w 單一職責(zé)原則實(shí)例 F實(shí)例解析實(shí)例解析 使用單一職責(zé)原則重構(gòu)后的類(lèi)圖:LoginForm- dao : UserDAO+init ()display ()validate (): void: void: voidUserDAO- db : DBUtil

10、+ findUser (String userName, String userPassword): booleanDBUtil+ getConnection () : ConnectionMainClass+ main (String args) : voidPage 11開(kāi)閉原則w 開(kāi)閉原則定義 F開(kāi)閉原則開(kāi)閉原則(Open-Closed Principle, OCP)定義如下:定義如下: 一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。也就是說(shuō)在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展,即實(shí)現(xiàn)在不修改源代碼的情況下改變這個(gè)模塊的行為。Page 12開(kāi)閉原則w 開(kāi)閉原則分析

11、F開(kāi)閉原則由開(kāi)閉原則由Bertrand Meyer于于1988年提出,它是面向?qū)ο笤O(shè)年提出,它是面向?qū)ο笤O(shè)計(jì)中最重要的原則之一。計(jì)中最重要的原則之一。F在開(kāi)閉原則的定義中,在開(kāi)閉原則的定義中,軟件實(shí)體可以指一個(gè)軟件模塊、一個(gè)軟件實(shí)體可以指一個(gè)軟件模塊、一個(gè)由多個(gè)類(lèi)組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類(lèi)由多個(gè)類(lèi)組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類(lèi)。Page 13開(kāi)閉原則w 開(kāi)閉原則分析 F抽象化抽象化是開(kāi)閉原則的關(guān)鍵。是開(kāi)閉原則的關(guān)鍵。 F絕大部分的設(shè)計(jì)模式都符合開(kāi)閉原則,在對(duì)每一個(gè)模式絕大部分的設(shè)計(jì)模式都符合開(kāi)閉原則,在對(duì)每一個(gè)模式進(jìn)行優(yōu)缺點(diǎn)評(píng)價(jià)時(shí)都會(huì)進(jìn)行優(yōu)缺點(diǎn)評(píng)價(jià)時(shí)都會(huì)以開(kāi)閉原則作為一個(gè)重要的評(píng)價(jià)以開(kāi)閉原則作

12、為一個(gè)重要的評(píng)價(jià)依據(jù)依據(jù),以判斷基于該模式設(shè)計(jì)的系統(tǒng)是否具備良好的靈,以判斷基于該模式設(shè)計(jì)的系統(tǒng)是否具備良好的靈活性和可擴(kuò)展性?;钚院涂蓴U(kuò)展性。 Page 14開(kāi)閉原則w 開(kāi)閉原則實(shí)例 F實(shí)例說(shuō)明實(shí)例說(shuō)明 某圖形界面系統(tǒng)提供了各種不同形狀的按鈕,客戶端代碼可針對(duì)這些按鈕進(jìn)行編程,用戶可能會(huì)改變需求要求使用不同的按鈕,原始設(shè)計(jì)方案如圖所示: 現(xiàn)對(duì)該系統(tǒng)進(jìn)行重構(gòu),使之滿足開(kāi)閉原則的要求。LoginForm- button : CircleButton+ display () : voidCircleButton+ view () : voidLoginForm- button : Rectangl

13、eButton+ display () : voidRectangleButton+ view () : voidPage 15開(kāi)閉原則w 開(kāi)閉原則實(shí)例 F實(shí)例解析實(shí)例解析 Page 16里氏代換原則 w 里氏代換原則定義 F里氏代換原則里氏代換原則(Liskov Substitution Principle, LSP)有有兩種定義方式,第一種定義方式相對(duì)嚴(yán)格,其定義如下:兩種定義方式,第一種定義方式相對(duì)嚴(yán)格,其定義如下: 如果對(duì)每一個(gè)類(lèi)型為S的對(duì)象o1,都有類(lèi)型為T(mén)的對(duì)象o2,使得以T定義的所有程序P在所有的對(duì)象o1都代換成o2時(shí),程序P的行為沒(méi)有變化,那么類(lèi)型S是類(lèi)型T的子類(lèi)型。F第二種更

14、容易理解的定義方式如下:第二種更容易理解的定義方式如下: 所有引用基類(lèi)(父類(lèi))的地方必須能透明地使用其子類(lèi)的對(duì)象。Page 17里氏代換原則 w 里氏代換原則分析F里氏代換原則由里氏代換原則由2008年圖靈獎(jiǎng)得主、美國(guó)第一位計(jì)算機(jī)年圖靈獎(jiǎng)得主、美國(guó)第一位計(jì)算機(jī)科學(xué)女博士、麻省理工學(xué)院科學(xué)女博士、麻省理工學(xué)院Barbara Liskov教授和卡內(nèi)教授和卡內(nèi)基基-梅隆大學(xué)梅隆大學(xué)Jeannette Wing教授于教授于1994年提出。年提出。芭芭拉利斯科夫(Barbara Liskov),美國(guó)計(jì)算機(jī)科學(xué)家,2008年圖靈獎(jiǎng)圖靈獎(jiǎng)(計(jì)算機(jī)領(lǐng)域的諾貝爾獎(jiǎng))得主,2004年約翰馮諾依曼獎(jiǎng)得主。美國(guó)工程院

15、院士,美國(guó)藝術(shù)與科學(xué)院院士,美國(guó)計(jì)算機(jī)協(xié)會(huì)會(huì)士?,F(xiàn)任麻省理工學(xué)院電子電氣與計(jì)算機(jī)科學(xué)系教授。她是美國(guó)第一個(gè)計(jì)算機(jī)科學(xué)女博士,第二位獲得圖靈獎(jiǎng)的女科學(xué)家。Page 18里氏代換原則 w 里氏代換原則分析F里氏代換原則可以通俗表述為:在里氏代換原則可以通俗表述為:在軟件中如果能夠使用軟件中如果能夠使用基類(lèi)對(duì)象,那么一定能夠使用其子類(lèi)對(duì)象基類(lèi)對(duì)象,那么一定能夠使用其子類(lèi)對(duì)象。把基類(lèi)都替。把基類(lèi)都替換成它的子類(lèi),程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過(guò)換成它的子類(lèi),程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過(guò)來(lái)則不成立,如果一個(gè)軟件實(shí)體使用的是一個(gè)子類(lèi)的話,來(lái)則不成立,如果一個(gè)軟件實(shí)體使用的是一個(gè)子類(lèi)的話,那么它不一

16、定能夠使用基類(lèi)。那么它不一定能夠使用基類(lèi)。F里氏代換原則是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一,由于使里氏代換原則是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一,由于使用基類(lèi)對(duì)象的地方都可以使用子類(lèi)對(duì)象,因此用基類(lèi)對(duì)象的地方都可以使用子類(lèi)對(duì)象,因此在程序中在程序中盡量使用基類(lèi)類(lèi)型來(lái)對(duì)對(duì)象進(jìn)行定義,而在運(yùn)行時(shí)再確盡量使用基類(lèi)類(lèi)型來(lái)對(duì)對(duì)象進(jìn)行定義,而在運(yùn)行時(shí)再確定其子類(lèi)類(lèi)型,用子類(lèi)對(duì)象來(lái)替換父類(lèi)對(duì)象定其子類(lèi)類(lèi)型,用子類(lèi)對(duì)象來(lái)替換父類(lèi)對(duì)象。Page 19里氏代換原則 w 里氏代換原則分析喜歡動(dòng)物喜歡貓 因?yàn)樨埵莿?dòng)物 Page 20里氏代換原則 w 里氏代換原則實(shí)例F實(shí)例說(shuō)明實(shí)例說(shuō)明 某系統(tǒng)需要實(shí)現(xiàn)對(duì)重要數(shù)據(jù)(如用戶密碼)的加密

17、處理,在數(shù)據(jù)操作類(lèi)(DataOperator)中需要調(diào)用加密類(lèi)中定義的加密算法,系統(tǒng)提供了兩個(gè)不同的加密類(lèi),CipherA和CipherB,它們實(shí)現(xiàn)不同的加密方法,在DataOperator中可以選擇其中的一個(gè)實(shí)現(xiàn)加密操作。如圖所示:DataOperator-cipherAcipherB: CipherA: CipherB+setCipherA (CipherA cipherA)setCipherB (CipherB cipherB)encrypt (String plainText): void: void: StringCipherA+ encrypt (String plainText)

18、 : StringCipherB+ encrypt (String plainText) : StringClient+ main (String args) : voidPage 21里氏代換原則 w 里氏代換原則實(shí)例F實(shí)例說(shuō)明實(shí)例說(shuō)明 如果需要更換一個(gè)加密算法類(lèi)或者增加并使用一個(gè)新的加密算法類(lèi),如將CipherA改為CipherB,則需要修改客戶類(lèi)Client和數(shù)據(jù)操作類(lèi)DataOperator的源代碼,違背了開(kāi)閉原則。 現(xiàn)使用里氏代換原則對(duì)其進(jìn)行重構(gòu),使得系統(tǒng)可以靈活擴(kuò)展,符合開(kāi)閉原則。Page 22里氏代換原則 w 里氏代換原則實(shí)例F實(shí)例解析實(shí)例解析 Page 23依賴倒轉(zhuǎn)原則 w 依

19、賴倒轉(zhuǎn)原則定義F依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則(Dependence Inversion Principle, DIP)的定義如下:的定義如下: 高層模塊不應(yīng)該依賴低層模塊,它們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。F另一種表述為:另一種表述為: 要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。Page 24依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F依賴倒轉(zhuǎn)原則是依賴倒轉(zhuǎn)原則是Robert C. Martin在在1996年為年為C+ Reporter所寫(xiě)的專(zhuān)欄所寫(xiě)的專(zhuān)欄Engineering Notebook的第三的第三篇,后來(lái)加入到他在篇,后來(lái)加入到他在2002年出版的經(jīng)典著作年出版的經(jīng)典著作Ag

20、ile Software Development, Principles, Patterns, and Practices中。中。Page 25依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F簡(jiǎn)單來(lái)說(shuō),依賴倒轉(zhuǎn)原則就是指:簡(jiǎn)單來(lái)說(shuō),依賴倒轉(zhuǎn)原則就是指:代碼要依賴于抽象的代碼要依賴于抽象的類(lèi),而不要依賴于具體的類(lèi)類(lèi),而不要依賴于具體的類(lèi);要針對(duì)接口或抽象類(lèi)編程,要針對(duì)接口或抽象類(lèi)編程,而不是針對(duì)具體類(lèi)編程而不是針對(duì)具體類(lèi)編程。F實(shí)現(xiàn)開(kāi)閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體實(shí)現(xiàn)開(kāi)閉原則的關(guān)鍵是抽象化,并且從抽象化導(dǎo)出具體化實(shí)現(xiàn),如果說(shuō)化實(shí)現(xiàn),如果說(shuō)開(kāi)閉原則是面向?qū)ο笤O(shè)計(jì)的目標(biāo)的話開(kāi)閉原則是面向?qū)ο笤O(shè)計(jì)的目

21、標(biāo)的話,那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計(jì)的主要手段。那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計(jì)的主要手段。 Page 26依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F依賴倒轉(zhuǎn)原則的常用實(shí)現(xiàn)方式之依賴倒轉(zhuǎn)原則的常用實(shí)現(xiàn)方式之一是一是在代碼中使用抽象類(lèi),而將在代碼中使用抽象類(lèi),而將具體類(lèi)放在配置文件中具體類(lèi)放在配置文件中。 “將抽象放進(jìn)代碼,將細(xì)節(jié)放進(jìn)元數(shù)據(jù)” 程序員修煉之道:從小工到專(zhuān)家Page 27依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F類(lèi)之間的耦合類(lèi)之間的耦合 零耦合關(guān)系 具體耦合關(guān)系 抽象耦合關(guān)系 F依賴倒轉(zhuǎn)原則要求客戶端依賴于抽象耦合,依賴倒轉(zhuǎn)原則要求客戶端依賴于抽象耦合,以抽象方以抽象方式耦合是依賴倒轉(zhuǎn)原則

22、的關(guān)鍵式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。Page 28依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F依賴注入依賴注入 Page 29依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F依賴注入依賴注入 構(gòu)造注入(Constructor Injection):通過(guò)構(gòu)造函數(shù)注入實(shí)例變量。 設(shè)值注入(Setter Injection):通過(guò)Setter方法注入實(shí)例變量。 接口注入(Interface Injection):通過(guò)接口方法注入實(shí)例變量。 Page 30依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F構(gòu)造注入public interface AbstractBook public void view();public interfa

23、ce AbstractReader public void read();public class ConcreteBook implements AbstractBookpublic void view() public class ConcreteReader implements AbstractReaderprivate AbstractBook book;public ConcreteReader(AbstractBook book) this.book = book;public void read() book.view(); Page 31依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F設(shè)

24、值注入public interface AbstractBook public void view();public interface AbstractReader public void setBook(AbstractBook book); public void read();public class ConcreteBook implements AbstractBookpublic void view() .public class ConcreteReader implements AbstractReaderprivate AbstractBook book;public vo

25、id setBook(AbstractBook book) this.book = book;public void read() book.view(); Page 32依賴倒轉(zhuǎn)原則 w 依賴倒轉(zhuǎn)原則分析F接口注入public interface AbstractBook public void view();public interface AbstractReader public void read(AbstractBook book);public class ConcreteBook implements AbstractBookpublic void view() .public

26、 class ConcreteReader implements AbstractReaderpublic void read(AbstractBook book) book.view(); Page 33依賴倒轉(zhuǎn)原則w 依賴倒轉(zhuǎn)原則實(shí)例F實(shí)例說(shuō)明實(shí)例說(shuō)明 某系統(tǒng)提供一個(gè)數(shù)據(jù)轉(zhuǎn)換模塊,可以將來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)轉(zhuǎn)換成多種格式,如可以轉(zhuǎn)換來(lái)自數(shù)據(jù)庫(kù)的數(shù)據(jù)(DatabaseSource)、也可以轉(zhuǎn)換來(lái)自文本文件的數(shù)據(jù)(TextSource),轉(zhuǎn)換后的格式可以是xml文件(XMLTransformer)、也可以是xls文件(XLSTransformer)等。DatabaseSourceMainCla

27、ss+ main (String args) : voidTextSourceXMLTransformerXLSTransformerPage 34依賴倒轉(zhuǎn)原則w 依賴倒轉(zhuǎn)原則實(shí)例F實(shí)例說(shuō)明實(shí)例說(shuō)明 由于需求的變化,該系統(tǒng)可能需要增加新的數(shù)據(jù)源或者新的文件格式,每增加一個(gè)新的類(lèi)型的數(shù)據(jù)源或者新的類(lèi)型的文件格式,客戶類(lèi)MainClass都需要修改源代碼,以便使用新的類(lèi),違背了開(kāi)閉原則?,F(xiàn)使用依賴倒轉(zhuǎn)原則對(duì)其進(jìn)行重構(gòu)。 Page 35依賴倒轉(zhuǎn)原則w 依賴倒轉(zhuǎn)原則實(shí)例F實(shí)例解析實(shí)例解析 DatabaseSourceMainClass+ main (String args) : voidTextSou

28、rceXMLTransformerXLSTransformerAbstractSourceAbstractTransformer.DatabaseSourceXMLTransformer.config.xmlPage 36接口隔離原則w 接口隔離原則定義F接口隔離原則接口隔離原則(Interface Segregation Principle, ISP)的定義如下:的定義如下: 客戶端不應(yīng)該依賴那些它不需要的接口。F注意,在該定義中的接口指的是所定義的方法。注意,在該定義中的接口指的是所定義的方法。F另一種定義方法如下:另一種定義方法如下: 一旦一個(gè)接口太大,則需要將它分割成一些更細(xì)小的接口,

29、使用該接口的客戶端僅需知道與之相關(guān)的方法即可。Page 37接口隔離原則w 接口隔離原則分析 F接口隔離原則是指使接口隔離原則是指使用多個(gè)專(zhuān)門(mén)的接口,而不使用單用多個(gè)專(zhuān)門(mén)的接口,而不使用單一的總接口一的總接口。每一個(gè)接口應(yīng)該承擔(dān)一種相對(duì)獨(dú)立的角。每一個(gè)接口應(yīng)該承擔(dān)一種相對(duì)獨(dú)立的角色,不多不少,不干不該干的事,該干的事都要干。色,不多不少,不干不該干的事,該干的事都要干。 (1) 一個(gè)接口就只代表一個(gè)角色,每個(gè)角色都有它特定的一個(gè)接口,此時(shí)這個(gè)原則可以叫做“角色隔離原則”。 (2) 接口僅僅提供客戶端需要的行為,即所需的方法,客戶端不需要的行為則隱藏起來(lái),應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口,而

30、不要提供大的總接口。 Page 38接口隔離原則w 接口隔離原則分析 F使用接口隔離原則拆分接口時(shí),首先必須滿足使用接口隔離原則拆分接口時(shí),首先必須滿足單一職單一職責(zé)原則責(zé)原則,將一組相關(guān)的操作定義在一個(gè)接口中,且在,將一組相關(guān)的操作定義在一個(gè)接口中,且在滿足高內(nèi)聚的前提下,接口中的方法越少越好。滿足高內(nèi)聚的前提下,接口中的方法越少越好。F可以在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)采用可以在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)采用定制服務(wù)定制服務(wù)的方式,即的方式,即為不為不同的客戶端提供寬窄不同的接口同的客戶端提供寬窄不同的接口,只提供用戶需要的,只提供用戶需要的行為,而隱藏用戶不需要的行為。行為,而隱藏用戶不需要的行為。Page 39

31、接口隔離原則w 接口隔離原則實(shí)例 F實(shí)例說(shuō)明實(shí)例說(shuō)明 下圖展示了一個(gè)擁有多個(gè)客戶類(lèi)的系統(tǒng),在系統(tǒng)中定義了一個(gè)巨大的接口AbstractService來(lái)服務(wù)所有的客戶類(lèi)??梢允褂媒涌诟綦x原則對(duì)其進(jìn)行重構(gòu)。ClientAAbstractService+operatorA ()operatorB ()operatorC ().: void: void: voidClientBClientCConcreteService+operatorA ()operatorB ()operatorC (): void: void: voidPage 40接口隔離原則w 接口隔離原則實(shí)例 F實(shí)例解析實(shí)例解析 Cli

32、entAAbstractServiceA+ operatorA ().: voidClientBClientCConcreteService+operatorA ()operatorB ()operatorC (): void: void: voidAbstractServiceB+ operatorB ().: voidAbstractServiceC+ operatorC ().: voidPage 41合成復(fù)用原則w 合成復(fù)用原則定義F合成復(fù)用原則合成復(fù)用原則(Composite Reuse Principle, CRP)又又稱為組合稱為組合/聚合復(fù)用原則聚合復(fù)用原則(Compositi

33、on/ Aggregate Reuse Principle, CARP),其定義如下:,其定義如下: 盡量使用對(duì)象組合,而不是繼承來(lái)達(dá)到復(fù)用的目的。Page 42合成復(fù)用原則w 合成復(fù)用原則分析 F合成復(fù)用原則就是指在一個(gè)新的對(duì)象里通過(guò)合成復(fù)用原則就是指在一個(gè)新的對(duì)象里通過(guò)關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)(包括組合關(guān)系和聚合關(guān)系)來(lái)使用一些已有的對(duì)象,來(lái)使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新對(duì)象使之成為新對(duì)象的一部分;新對(duì)象通過(guò)委派調(diào)用已有通過(guò)委派調(diào)用已有對(duì)象的方法達(dá)到復(fù)用對(duì)象的方法達(dá)到復(fù)用其已有功能的目的。簡(jiǎn)言之:要其已有功能的目的。簡(jiǎn)言之:要盡量使用組合盡量使用組合/聚合

34、關(guān)系,少用繼承聚合關(guān)系,少用繼承。Page 43合成復(fù)用原則w 合成復(fù)用原則分析 F在面向?qū)ο笤O(shè)計(jì)中,可以通過(guò)兩種基本方法在不同的在面向?qū)ο笤O(shè)計(jì)中,可以通過(guò)兩種基本方法在不同的環(huán)境中復(fù)用已有的設(shè)計(jì)和實(shí)現(xiàn),即通過(guò)環(huán)境中復(fù)用已有的設(shè)計(jì)和實(shí)現(xiàn),即通過(guò)組合組合/聚合關(guān)系聚合關(guān)系或通過(guò)或通過(guò)繼承繼承。 繼承復(fù)用:實(shí)現(xiàn)簡(jiǎn)單,易于擴(kuò)展。破壞系統(tǒng)的封裝性,從基類(lèi)繼承而來(lái)的實(shí)現(xiàn)是靜態(tài)的,不可能在運(yùn)行時(shí)發(fā)生改變,沒(méi)有足夠的靈活性;只能在有限的環(huán)境中使用。(“白箱”復(fù)用 ) 組合/聚合復(fù)用:耦合度相對(duì)較低,選擇性地調(diào)用成員對(duì)象的操作;可以在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行。(“黑箱”復(fù)用 )Page 44合成復(fù)用原則w 合成復(fù)用原則

35、分析 F組合組合/聚合可以聚合可以使系統(tǒng)更加靈活使系統(tǒng)更加靈活,類(lèi)與類(lèi)之間的,類(lèi)與類(lèi)之間的耦合度降低耦合度降低,一個(gè)類(lèi)的變化對(duì)其他類(lèi)造成的影響相對(duì)較少,因此一般一個(gè)類(lèi)的變化對(duì)其他類(lèi)造成的影響相對(duì)較少,因此一般首選首選使用組合使用組合/聚合來(lái)實(shí)現(xiàn)復(fù)用聚合來(lái)實(shí)現(xiàn)復(fù)用;F其次才考慮繼承,在使用繼承時(shí),需要嚴(yán)格遵循里氏代換原其次才考慮繼承,在使用繼承時(shí),需要嚴(yán)格遵循里氏代換原則,有效使用繼承會(huì)有助于對(duì)問(wèn)題的理解,降低復(fù)雜度,而則,有效使用繼承會(huì)有助于對(duì)問(wèn)題的理解,降低復(fù)雜度,而濫用繼承反而會(huì)增加系統(tǒng)構(gòu)建和維護(hù)的難度以及系統(tǒng)的復(fù)雜濫用繼承反而會(huì)增加系統(tǒng)構(gòu)建和維護(hù)的難度以及系統(tǒng)的復(fù)雜度,因此需要度,因此需

36、要慎重使用繼承復(fù)用慎重使用繼承復(fù)用。Page 45合成復(fù)用原則w 合成復(fù)用原則實(shí)例 F實(shí)例說(shuō)明實(shí)例說(shuō)明 某教學(xué)管理系統(tǒng)部分?jǐn)?shù)據(jù)庫(kù)訪問(wèn)類(lèi)設(shè)計(jì)如圖所示:DBUtil+ getConnection ().: ConnectionStudentDAO+findStudentById (String id)findAllStudents ()save (StudentDTO student).: StudentDTO: List: intTeacherDAO+findTeacherById (String id)findAllTeachers ()save (TeacherDTO teacher).:

37、TeacherDTO: List: intPage 46合成復(fù)用原則w 合成復(fù)用原則實(shí)例 F實(shí)例說(shuō)明實(shí)例說(shuō)明 如果需要更換數(shù)據(jù)庫(kù)連接方式,如原來(lái)采用JDBC連接數(shù)據(jù)庫(kù),現(xiàn)在采用數(shù)據(jù)庫(kù)連接池連接,則需要修改DBUtil類(lèi)源代碼。如果StudentDAO采用JDBC連接,但是TeacherDAO采用連接池連接,則需要增加一個(gè)新的DBUtil類(lèi),并修改StudentDAO或TeacherDAO的源代碼,使之繼承新的數(shù)據(jù)庫(kù)連接類(lèi),這將違背開(kāi)閉原則,系統(tǒng)擴(kuò)展性較差。 現(xiàn)使用合成復(fù)用原則對(duì)其進(jìn)行重構(gòu)。Page 47合成復(fù)用原則w 合成復(fù)用原則實(shí)例 F實(shí)例解析實(shí)例解析 DBUtil+ getConnecti

38、on ().: ConnectionStudentDAO- dBOperator : DBUtil+setDBOperator (DBUtil dBOperator)findStudentById (String id)findAllStudents ()save (StudentDTO student).: void: StudentDTO: List: intTeacherDAO- dBOperator : DBUtil+setDBOperator (DBUtil dBOperator)findTeacherById (String id)findAllTeachers ()save (T

39、eacherDTO teacher).: void: TeacherDTO: List: intNewDBUtil+ getConnection ().: ConnectionPage 48迪米特法則 w 迪米特法則定義F迪米特法則迪米特法則(Law of Demeter, LoD)又稱為最少知識(shí)原又稱為最少知識(shí)原則則(Least Knowledge Principle, LKP),它有多種定,它有多種定義方法,其中幾種典型定義如下:義方法,其中幾種典型定義如下: (1) 不要和“陌生人”說(shuō)話。 (2) 只與你的直接朋友通信。 (3) 每一個(gè)軟件單位對(duì)其他的單位都只有最少的知識(shí),而且局限于那些

40、與本單位密切相關(guān)的軟件單位。Page 49迪米特法則 w 迪米特法則分析F迪米特法則來(lái)自于迪米特法則來(lái)自于1987年秋美國(guó)東北大學(xué)年秋美國(guó)東北大學(xué)(Northeastern University)一個(gè)一個(gè)名為名為“Demeter”的研究項(xiàng)目的研究項(xiàng)目。F簡(jiǎn)單來(lái)說(shuō),迪米特法則就是指簡(jiǎn)單來(lái)說(shuō),迪米特法則就是指一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用與其他實(shí)體發(fā)生相互作用。這樣,當(dāng)一個(gè)模塊修改時(shí),就會(huì)。這樣,當(dāng)一個(gè)模塊修改時(shí),就會(huì)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對(duì)容易,這是對(duì)軟件實(shí)盡量少的影響其他的模塊,擴(kuò)展會(huì)相對(duì)容易,這是對(duì)軟件實(shí)體之間通信的限制,它要求限制軟件實(shí)

41、體之間通信的寬度和體之間通信的限制,它要求限制軟件實(shí)體之間通信的寬度和深度。深度。Page 50迪米特法則 w 迪米特法則分析F在迪米特法則中,對(duì)于一個(gè)對(duì)象,其在迪米特法則中,對(duì)于一個(gè)對(duì)象,其朋友朋友包括以下幾類(lèi):包括以下幾類(lèi): (1) 當(dāng)前對(duì)象本身(this); (2) 以參數(shù)形式傳入到當(dāng)前對(duì)象方法中的對(duì)象; (3) 當(dāng)前對(duì)象的成員對(duì)象; (4) 如果當(dāng)前對(duì)象的成員對(duì)象是一個(gè)集合,那么集合中的元素也都是朋友; (5) 當(dāng)前對(duì)象所創(chuàng)建的對(duì)象。F任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的任何一個(gè)對(duì)象,如果滿足上面的條件之一,就是當(dāng)前對(duì)象的“朋朋友友”,否則就是,否則就是“陌生人陌生人”

42、。Page 51迪米特法則 w 迪米特法則分析F迪米特法則可分為狹義法則和廣義法則。迪米特法則可分為狹義法則和廣義法則。在狹義的迪米特法在狹義的迪米特法則中,如果兩個(gè)類(lèi)之間不必彼此直接通信則中,如果兩個(gè)類(lèi)之間不必彼此直接通信,那么這兩個(gè)類(lèi)就那么這兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用不應(yīng)當(dāng)發(fā)生直接的相互作用,如果其中的一個(gè)類(lèi)需要調(diào)用另,如果其中的一個(gè)類(lèi)需要調(diào)用另一個(gè)類(lèi)的某一個(gè)方法的話,可以通過(guò)一個(gè)類(lèi)的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。 Page 52迪米特法則 w 迪米特法則分析F狹義的迪米特法則:可以狹義的迪米特法則:可以降低類(lèi)之間的耦合降低類(lèi)之間的耦合,但是會(huì)在系統(tǒng),但是會(huì)在系統(tǒng)中增加大量的小方法并散落在系統(tǒng)的各個(gè)角落,它可以使一中增加大量的小方法并散落在系統(tǒng)的各個(gè)角落,它可以使一個(gè)系統(tǒng)的局部設(shè)計(jì)簡(jiǎn)化,因?yàn)槊?/p>

溫馨提示

  • 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)論