單一職責(zé)原則
一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)交胚。或者說(shuō)盈电,一個(gè)類蝴簇,應(yīng)該只有一個(gè)引起它變化的原因。
開(kāi)閉原則
一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放匆帚,對(duì)修改關(guān)閉熬词。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展。
在定義中吸重,軟件實(shí)體可以指一個(gè)軟件模塊互拾、一個(gè)由多個(gè)類組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類。
為了滿足開(kāi)閉原則嚎幸,需要對(duì)系統(tǒng)進(jìn)行抽象化設(shè)計(jì)颜矿,抽象化是開(kāi)閉原則的關(guān)鍵。
里氏替換原則
所有引用基類(父類)的地方必須能透明的使用其子類的對(duì)象嫉晶。
里氏代換原則表明骑疆,在軟件中將一個(gè)基類對(duì)象替換成它的子類對(duì)象田篇,程序?qū)⒉粫?huì)產(chǎn)生任何錯(cuò)誤和異常,反過(guò)來(lái)則不成立箍铭。
里氏代換原則是實(shí)現(xiàn)開(kāi)閉原則的重要方式之一泊柬,在運(yùn)用里氏代換原則時(shí),應(yīng)該將父類設(shè)計(jì)為抽象類或者接口诈火,讓子類繼承父類或?qū)崿F(xiàn)父接口兽赁,并實(shí)現(xiàn)在父類中聲明的方法,運(yùn)行時(shí)柄瑰,子類實(shí)例替換父類實(shí)例闸氮,可以很方便的擴(kuò)展系統(tǒng)的功能,無(wú)須修改原有子類的代碼教沾,增加新的功能可以通過(guò)增加一個(gè)新的子類來(lái)實(shí)現(xiàn)蒲跨。
接口隔離原則
使用多個(gè)專門(mén)的接口,而不使用單一的總接口授翻,即客戶端不應(yīng)該依賴那些他不需要的接口或悲。
這里的接口有兩種不同的含義:一種是指一個(gè)類型所具有的方法特征的集合,僅僅是一種邏輯上的抽象堪唐;另一種是指某種語(yǔ)言具體的接口定義巡语,有嚴(yán)格的定義和結(jié)構(gòu),比如Java語(yǔ)言中的interface淮菠。
依賴倒置原則
如果說(shuō)開(kāi)閉原則是面向?qū)ο笤O(shè)計(jì)的目標(biāo)的話男公,那么依賴倒轉(zhuǎn)原則就是面向?qū)ο笤O(shè)計(jì)的主要實(shí)現(xiàn)機(jī)制之一,它是系統(tǒng)抽象化的具體實(shí)現(xiàn)合陵。
抽象不應(yīng)該依賴于細(xì)節(jié)枢赔,細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。換句話說(shuō)拥知,要針對(duì)接口編程踏拜,而不是針對(duì)實(shí)現(xiàn)編程。
依賴倒轉(zhuǎn)原則要求在程序代碼中傳遞傳遞參數(shù)時(shí)或者關(guān)聯(lián)關(guān)系中低剔,盡量引用層次高的抽象層類速梗,即使用接口和抽象類進(jìn)行變量類型聲明、參數(shù)類型聲明襟齿、方法返回類型聲明姻锁,以及數(shù)據(jù)類型的轉(zhuǎn)換等,而不要使用具體類來(lái)做這些事情猜欺。
在實(shí)現(xiàn)依賴倒轉(zhuǎn)原則時(shí)屋摔,需要針對(duì)抽象層編程,而將具體類的對(duì)象通過(guò)依賴注入的方式注入到其他對(duì)象中替梨。依賴注入是指當(dāng)一個(gè)對(duì)象要與其他對(duì)象發(fā)生依賴關(guān)系時(shí)钓试,通過(guò)抽象來(lái)注入所依賴的對(duì)象疯攒。
常用的注入方式有三種:
構(gòu)造注入:通過(guò)構(gòu)造函數(shù)來(lái)傳入具體類的對(duì)象斯入。
設(shè)置注入:通過(guò)setter方法來(lái)傳入具體類的對(duì)象。
接口注入:通過(guò)實(shí)現(xiàn)在接口中聲明的業(yè)務(wù)方法來(lái)傳入具體類的對(duì)象场斑。
合成復(fù)用原則
盡量使用對(duì)象組合糠睡,而不是繼承來(lái)達(dá)到復(fù)用的目的挽鞠。
迪米特法則
一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用。