依賴(lài)倒置原則與springIOC學(xué)習(xí)_第1頁(yè)
依賴(lài)倒置原則與springIOC學(xué)習(xí)_第2頁(yè)
依賴(lài)倒置原則與springIOC學(xué)習(xí)_第3頁(yè)
依賴(lài)倒置原則與springIOC學(xué)習(xí)_第4頁(yè)
依賴(lài)倒置原則與springIOC學(xué)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、設(shè)計(jì)模式之 依賴(lài)倒轉(zhuǎn)原則初識(shí)初識(shí)依賴(lài)倒轉(zhuǎn)、控制反轉(zhuǎn)、依賴(lài)注入三者含義和目標(biāo)基本一致,即通過(guò)抽象接口解耦和消除依賴(lài)關(guān)系依賴(lài)倒置的核心思想是依賴(lài)于抽象。1、高層模塊不應(yīng)該依賴(lài)低層模塊,兩者都應(yīng)該依賴(lài)其抽象;2、抽象不應(yīng)該依賴(lài)細(xì)節(jié);3、細(xì)節(jié)應(yīng)該依賴(lài)抽象。高層模塊和低層模塊:每一個(gè)邏輯的實(shí)現(xiàn)都是由原子邏輯組成的,不可分割的原子邏輯就是低層模塊,原子邏輯的再組裝就是高層模塊。細(xì)節(jié)和抽象:在Java語(yǔ)言中,抽象就是指接口或抽象類(lèi),兩者都是不能直接被實(shí)例化的;細(xì)節(jié)就是實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)接口或繼承抽象類(lèi)而產(chǎn)生的類(lèi)就是細(xì)節(jié),其特點(diǎn)就是可以直接被實(shí)例化,也就是可以加上一個(gè)關(guān)鍵字new產(chǎn)生一個(gè)對(duì)象。依賴(lài)倒置原則在Java

2、語(yǔ)言中的表現(xiàn)就是:1、模塊間的依賴(lài)是通過(guò)抽象發(fā)生,實(shí)現(xiàn)類(lèi)之間不發(fā)生直接的依賴(lài)關(guān)系,其依賴(lài)關(guān)系是通過(guò)接口或抽象類(lèi)產(chǎn)生的;2、接口或抽象類(lèi)不依賴(lài)于實(shí)現(xiàn)類(lèi);3、實(shí)現(xiàn)類(lèi)依賴(lài)接口或抽象類(lèi)。一句話(huà):面向接口編程反例:代碼:代碼:司機(jī)通過(guò)調(diào)用奔馳車(chē)的run方法開(kāi)動(dòng)奔馳車(chē)public class Driver /司機(jī)的主要職責(zé)就是駕駛汽車(chē) public void drive(Benz benz) benz.run(); public class Benz /汽車(chē)肯定會(huì)跑 public void run() System.out.println(奔馳汽車(chē)開(kāi)始運(yùn)行.); 有車(chē),有司機(jī),在Client場(chǎng)景類(lèi)產(chǎn)生相應(yīng)

3、的對(duì)象public class Client public static void main(String args) Driver zhangSan = new Driver(); Benz benz = new Benz(); /張三開(kāi)奔馳車(chē) zhangSan.drive(benz); 通過(guò)以上的代碼,完成了司機(jī)開(kāi)動(dòng)奔馳車(chē)的場(chǎng)景,到目前為止,這個(gè)司機(jī)開(kāi)奔馳車(chē)的項(xiàng)目沒(méi)有任何問(wèn)題。但是業(yè)務(wù)需求變更永無(wú)休止,在發(fā)生變更時(shí)才能發(fā)覺(jué)我們的設(shè)計(jì)或程序是否是松耦合。我們?cè)谝欢蚊菜婆褪某绦蛏霞由弦粔K小石頭:張三司機(jī)不僅要開(kāi)奔馳車(chē),還要開(kāi)寶馬車(chē),又該怎么實(shí)現(xiàn)呢?我們先把寶馬車(chē)產(chǎn)生出來(lái)public clas

4、s BMW /寶馬車(chē)當(dāng)然也可以開(kāi)動(dòng)了 public void run() System.out.println(寶馬汽車(chē)開(kāi)始運(yùn)行.); 寶馬車(chē)也產(chǎn)生了,但是我們卻沒(méi)有辦法讓張三開(kāi)動(dòng)起來(lái),為什么?因?yàn)閺埲龥](méi)有開(kāi)動(dòng)寶馬車(chē)的方法。一個(gè)司機(jī)竟然只能開(kāi)奔馳車(chē)而不能開(kāi)寶馬車(chē),這也太不合理了!在現(xiàn)實(shí)世界都不允許存在這種情況,何況程序還是對(duì)現(xiàn)實(shí)世界的抽象,我們的設(shè)計(jì)出現(xiàn)了問(wèn)題:司機(jī)類(lèi)和奔馳車(chē)類(lèi)之間是一個(gè)緊耦合的關(guān)系,其導(dǎo)致的結(jié)果就是系統(tǒng)的可維護(hù)性大大降低,可讀性降低,兩個(gè)相似的類(lèi)需要閱讀兩個(gè)文件,你樂(lè)意嗎?還有穩(wěn)定性,什么是穩(wěn)定性?固化的、健壯的才是穩(wěn)定的,這里只是增加了一個(gè)車(chē)類(lèi)就需要修改司機(jī)類(lèi),這不是穩(wěn)定性

5、,這是易變性。被依賴(lài)者的變更竟然讓依賴(lài)者來(lái)承擔(dān)修改的成本。從這里,我們知道使用抽象才能解決這個(gè)問(wèn)題。穩(wěn)定性較高的設(shè)計(jì),在周?chē)h(huán)境頻繁變化的時(shí)候,依然可以做到“我自巋然不動(dòng)”?!睖p少并行開(kāi)發(fā)引起的風(fēng)險(xiǎn)”,什么是并行開(kāi)發(fā)的風(fēng)險(xiǎn)?并行開(kāi)發(fā)最大的風(fēng)險(xiǎn)就是風(fēng)險(xiǎn)擴(kuò)散,本來(lái)只是一段程序的錯(cuò)誤或異常,逐步波及一個(gè)功能,一個(gè)模塊,甚至到最后毀壞了整個(gè)項(xiàng)目。一個(gè)團(tuán)隊(duì),20人開(kāi)發(fā),各人負(fù)責(zé)不同的功能模塊,甲負(fù)責(zé)汽車(chē)類(lèi)的建造,乙負(fù)責(zé)司機(jī)類(lèi)的建造,在甲沒(méi)有完成的情況下,乙是不能完全地編寫(xiě)代碼的,缺少汽車(chē)類(lèi),編譯器根本就不會(huì)讓你通過(guò)!在缺少Benz類(lèi)的情況下,Driver類(lèi)能編譯嗎?更不要說(shuō)是單元測(cè)試了!在這種不使用依賴(lài)

6、倒置原則的環(huán)境中,所有的開(kāi)發(fā)工作都是“單線(xiàn)程”的,甲做完,乙再做,然后是丙繼續(xù),這在90年代“個(gè)人英雄主義”編程模式中還是比較適用的,一個(gè)人完成所有的代碼工作,但在現(xiàn)在的大中型項(xiàng)目中已經(jīng)是完全不能勝任了,一個(gè)項(xiàng)目是一個(gè)團(tuán)隊(duì)的協(xié)作結(jié)果,一個(gè)“英雄”再牛也不可能了解所有的業(yè)務(wù)和所有的技術(shù),要協(xié)作就要并行開(kāi)發(fā),要并行開(kāi)發(fā)就要解決模塊之間的項(xiàng)目依賴(lài)關(guān)系,那然后呢?依賴(lài)倒置原則就隆重出場(chǎng)了!正例:publicinterfaceIDriver/是司機(jī)就應(yīng)該會(huì)駕駛汽車(chē)publicvoiddrive(ICarcar);publicclassDriverimplementsIDriver/司機(jī)的主要職責(zé)就是駕駛

7、汽車(chē)publicvoiddrive(ICarcar)car.run();publicinterfaceICar/是汽車(chē)就應(yīng)該能跑publicvoidrun();publicclassBenzimplementsICar/汽車(chē)肯定會(huì)跑publicvoidrun()System.out.println(奔馳汽車(chē)開(kāi)始運(yùn)行.);publicclassBMWimplementsICar/寶馬車(chē)當(dāng)然也可以開(kāi)動(dòng)了publicvoidrun()System.out.println(寶馬汽車(chē)開(kāi)始運(yùn)行.);業(yè)務(wù)場(chǎng)景中使用時(shí):public class Client public static void main(S

8、tring args) IDriver zhangSan = new Driver();ICar benz = new Benz();/張三開(kāi)奔馳車(chē)zhangSan.drive(benz);在新增加低層模塊時(shí),只修改了業(yè)務(wù)場(chǎng)景類(lèi),也就是高層模塊,對(duì)其他低層模塊如Driver類(lèi)不需要做任何修改,業(yè)務(wù)就可以運(yùn)行,把“變更”引起的風(fēng)險(xiǎn)擴(kuò)散降低到最小。 注意 在Java中,只要定義變量就必然要有類(lèi)型,一個(gè)變量可以有兩個(gè)類(lèi)型:顯示類(lèi)型和真實(shí)類(lèi)型,顯示類(lèi)型是在定義的時(shí)候賦予的類(lèi)型,真實(shí)類(lèi)型是對(duì)象的類(lèi)型,如zhangSan的顯示類(lèi)型是IDriver,真實(shí)類(lèi)型是Driver小結(jié):小結(jié):抽象是對(duì)實(shí)現(xiàn)的約束,對(duì)依

9、賴(lài)者而言,也是一種契約,不僅僅約束自己,還同時(shí)約束自己與外部的關(guān)系,其目的是保證所有的細(xì)節(jié)不逃脫契約的范疇,確保約束雙方按照既定的契約(抽象)共同發(fā)展,只要抽象這根基線(xiàn)在,細(xì)節(jié)就逃脫不了這個(gè)圈圈。最佳實(shí)踐:1、每個(gè)類(lèi)盡量都有接口或抽象類(lèi),或者抽象類(lèi)和接口兩者都具備。 這是依賴(lài)倒置的基本要求,接口和抽象類(lèi)都是屬于抽象的,有了抽象才可能依賴(lài)倒置。2、變量的顯示類(lèi)型盡量是接口或者是抽象類(lèi)。 很多書(shū)上說(shuō)變量的類(lèi)型一定要是接口或者是抽象類(lèi),這個(gè)有點(diǎn)絕對(duì)化了,比如一個(gè)工具類(lèi),xxxUtils一般是不需要接口或是抽象類(lèi)的3、任何類(lèi)都不應(yīng)該從具體類(lèi)派生。 如果一個(gè)項(xiàng)目處于開(kāi)發(fā)狀態(tài),確實(shí)不應(yīng)該有從具體類(lèi)派生出的

10、子類(lèi)的情況,但這也不是絕對(duì)的,因?yàn)槿硕际菚?huì)犯錯(cuò)誤的,有時(shí)設(shè)計(jì)缺陷是在所難免的,因此只要不超過(guò)兩層的繼承都是可以忍受的。特別是做項(xiàng)目維護(hù)的同志,基本上可以不考慮這個(gè)規(guī)則,為什么?維護(hù)工作基本上都是做擴(kuò)展開(kāi)發(fā),修復(fù)行為,通過(guò)一個(gè)繼承關(guān)系,覆寫(xiě)一個(gè)方法就可以修正一個(gè)很大的Bug,何必再要去繼承最高的基類(lèi)呢?4、盡量不要覆寫(xiě)基類(lèi)的方法。 如果基類(lèi)是一個(gè)抽象類(lèi),而且這個(gè)方法已經(jīng)實(shí)現(xiàn)了,子類(lèi)盡量不要覆寫(xiě)。類(lèi)間依賴(lài)的是抽象,覆寫(xiě)了抽象方法,對(duì)依賴(lài)的穩(wěn)定性會(huì)產(chǎn)生一定的影響。5、結(jié)合里氏替換原則使用(父類(lèi)出現(xiàn)的地方子類(lèi)就能出現(xiàn))講了這么多,那到底什么是“倒置”呢?我們先說(shuō)“正置”是什么意思,依賴(lài)正置就是類(lèi)間的依

11、賴(lài)是實(shí)實(shí)在在的實(shí)現(xiàn)類(lèi)間的依賴(lài),也就是面向?qū)崿F(xiàn)編程,這也是正常人的思維方式,我要開(kāi)奔馳車(chē)就依賴(lài)奔馳車(chē),我要使用筆記本電腦就直接依賴(lài)筆記本電腦,而編寫(xiě)程序需要的是對(duì)現(xiàn)實(shí)世界的事物進(jìn)行抽象,抽象的結(jié)果就是有了抽象類(lèi)和接口,然后我們根據(jù)系統(tǒng)設(shè)計(jì)的需要產(chǎn)生了抽象間的依賴(lài),代替了人們傳統(tǒng)思維中的事物間的依賴(lài),“倒置”就是從這里產(chǎn)生的。Spring IOCSpring IOC(Inversion of Control)、)、DIDI(Dependency Injection)IoC控制反轉(zhuǎn)(也稱(chēng)作依賴(lài)性注入DI)是Spring的核心他的基本概念是:不創(chuàng)建對(duì)象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對(duì)象和服

12、務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。Spring中的IoC容器負(fù)責(zé)將這些聯(lián)系在一起。在典型的 IOC 場(chǎng)景中,容器創(chuàng)建了所有對(duì)象,并設(shè)置必要的屬性將它們連接在一起,由容器來(lái)決定什么時(shí)間調(diào)用方法例子:例子:Spring配置:1、setter方法注入 bean property/bean/2、 constructor構(gòu)造函數(shù)注入 bean constructor-arg/bean/SpringSpring的核心容器的核心容器IOCIOC就是提供對(duì)象的配置管理功能。就是提供對(duì)象的配置管理功能。Spring中IOC的基本概念是:基于OO設(shè)計(jì)原則的TheHollywood Princip

13、le:Dont call us, well call you(別找我,我會(huì)來(lái)找你的)。程序中各個(gè)組件之間的關(guān)系,不由程序代碼直接操控,而由容器控制??刂茩?quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,即所謂的反轉(zhuǎn)。也就是說(shuō)對(duì)象的控制權(quán)轉(zhuǎn)交給spring容器。直接點(diǎn)說(shuō):1、不用再去NEW對(duì)象了,之所以少寫(xiě)new,是因?yàn)橄到y(tǒng)的配置(即第三方的管理) 2、面向接口,符合OO (Object Oriented) 3、系統(tǒng)的可擴(kuò)展與代碼的易維護(hù)springspring小結(jié)小結(jié)將對(duì)象交與IOC容器管理,避免在程序中出現(xiàn)具體實(shí)現(xiàn)。通過(guò)代碼我們可以看出IOC依賴(lài)注入的好處:1.對(duì)象之間的依賴(lài)關(guān)系,不由對(duì)象自身來(lái)負(fù)責(zé),而是由容器

14、依據(jù)配置文件動(dòng)態(tài)建立,這樣就很靈活,可配。2.采用依賴(lài)注入,模塊之間一定是松散耦合的3.代碼易維護(hù)易測(cè)試如果不使用框架,我們傳統(tǒng)的寫(xiě)法一般是自己建立工廠或者用單例來(lái)處理業(yè)務(wù)層與Dao層,而使用了Spring,這些工作我們就都不用管了。依賴(lài)倒置、控制反轉(zhuǎn)、依賴(lài)注入?yún)^(qū)別:依賴(lài)倒置、控制反轉(zhuǎn)、依賴(lài)注入?yún)^(qū)別:依賴(lài)倒置、控制反轉(zhuǎn)和依賴(lài)注入的區(qū)分依賴(lài)倒置、控制反轉(zhuǎn)和依賴(lài)注入從思想來(lái)講是統(tǒng)一的,或者說(shuō)是類(lèi)似的,有人也說(shuō)它們是同一個(gè)東西。但是還是可以做一點(diǎn)區(qū)分:1、依賴(lài)倒置原則:是進(jìn)行軟件設(shè)計(jì)時(shí)考慮遵循的一個(gè)原則。具體為:(1)上層模塊不應(yīng)該依賴(lài)于下層模塊,它們共同依賴(lài)于一個(gè)抽象。(2)抽象不能依賴(lài)于具象,具象依賴(lài)于抽象。2、控制反轉(zhuǎn):是軟件運(yùn)行時(shí)體現(xiàn)出來(lái)的一個(gè)特征:如果對(duì)象A運(yùn)行時(shí)依賴(lài)于對(duì)象B,但A并不去創(chuàng)建B,而是從外界直接取得B。也就是說(shuō),一個(gè)對(duì)象并不是自己去創(chuàng)建它所依賴(lài)的其它對(duì)象。3、依賴(lài)注入:是控制反轉(zhuǎn)的一種實(shí)現(xiàn)手段。如上面的例子,B的取得并不

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論