版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章 依賴倒置原則,一 基本定義 依賴倒置原則(Dependence Inversion Principle, DIP)這個(gè)名字看著有點(diǎn)別扭,“依賴,這到底是什么意思?依賴倒置原則的原始定義是:,High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions,翻譯過(guò)來(lái),包含三層含義: 高層模塊
2、不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象; 抽象不應(yīng)該依賴細(xì)節(jié) 細(xì)節(jié)應(yīng)該依賴抽象.,依賴倒置原則在Java語(yǔ)言中的表現(xiàn)就是: 模塊間的依賴通過(guò)抽象發(fā)生,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過(guò)接口或抽象類產(chǎn)生的。 接口或抽象類不依賴于實(shí)現(xiàn)類, 實(shí)現(xiàn)類依賴接口或抽象類。 更加精簡(jiǎn)的定義就是“面向接口編程.SOD (Object-OuientedDesign,面向?qū)ο笤O(shè)計(jì))的精髓之一,二 契約式編程,現(xiàn)在的汽車越來(lái)越便宜了,一個(gè)衛(wèi)生間的造價(jià)就可以買到一輛不錯(cuò)的汽車,有汽車就必然有人來(lái)駕駛,司機(jī)駕駛奔馳車的類圖如圖3一1所示。,public class Driver /司機(jī)的主要職責(zé)就是駕駛
3、汽車 public void drive(Benz benz) benz.run(); ,我們?cè)谝欢蚊菜婆褪某绦蛏霞由弦粔K小石頭:張三司機(jī)不僅要開奔馳車,還要開寶馬車,又該怎么實(shí)現(xiàn)呢?麻煩出來(lái)了,那好,我們走一步是一步,我們先把寶馬車產(chǎn)生出來(lái),實(shí)現(xiàn)過(guò)程如代碼清單3-4所示。,public class BMW /寶馬車當(dāng)然也可以開動(dòng)了 public void run() System.out.println(寶馬汽車開始運(yùn)行.); ,寶馬車也產(chǎn)生了,但是我們卻沒有辦法讓張三開動(dòng)起來(lái),為什么?張三沒有開動(dòng)寶馬車的方法呀!一個(gè)拿有C駕照的司機(jī)竟然只能開奔馳車而不能開寶馬車,這也太不合理了!在現(xiàn)實(shí)世
4、界都不允許存在這種情況,何況程序還是對(duì)現(xiàn)實(shí)世界的抽象,我們的設(shè)計(jì)出現(xiàn)了問題:司機(jī)類和奔馳車類之間是緊藕合的關(guān)系,其導(dǎo)致的結(jié)果就是系統(tǒng)的可維護(hù)性大大降低,可讀性降低,建立兩個(gè)接口:IDriver和ICar,分別定義了司機(jī)和汽車的各個(gè)職能,司機(jī)就是駕駛汽車,必須實(shí)現(xiàn)drive()方法,其實(shí)現(xiàn)過(guò)程如代碼清單3-5所示,public interface IDriver /是司機(jī)就應(yīng)該會(huì)駕駛汽車 public void drive(ICar car); ,public class Driver implements IDriver /司機(jī)的主要職責(zé)就是駕駛汽車 public void drive(ICa
5、r car) car.run(); ,public interface ICar /是汽車就應(yīng)該能跑 public void run(); ,public class BMW implements ICar /寶馬車當(dāng)然也可以開動(dòng)了 public void run() System.out.println(寶馬汽車開始運(yùn)行.); ,public class Benz implements ICar /汽車肯定會(huì)跑 public void run() System.out.println(奔馳汽車開始運(yùn)行.); ,public class Client public static void ma
6、in(String args) IDriver zhangSan = new Driver(); /ICar benz = new Benz(); ICar bmw = new BMW(); /張三開奔馳車 zhangSan.drive(bmw); ,Client屬于高層業(yè)務(wù)邏輯,它對(duì)低層模塊的依賴都建立在抽象上,zhangSan的表面類型是IDriver, Benz的表面類型是ICar,也許你要問,在這個(gè)高層模塊中也調(diào)用到了低層模塊,比如new Driver()和new Benz()等,如何解釋?確實(shí)如此,zhangSan的表面類型是IDriver,是一個(gè)接口,是抽象的、非實(shí)體化的,在其后的
7、所有操作中,zhangSan都是以工Driver類型進(jìn)行操作,屏蔽了細(xì)節(jié)對(duì)抽象的影響。當(dāng)然,張三如果要開寶馬車,也很容易,我們只要修改業(yè)務(wù)場(chǎng)景類就可以,實(shí)現(xiàn)過(guò)程如代碼清單3-9所示,在新增加低層模塊時(shí),只修改了業(yè)務(wù)場(chǎng)景類,也就是高層模塊,對(duì)其他低層模塊如Driver類不需要做任何修改,業(yè)務(wù)就可以運(yùn)行,把“變更”引起的風(fēng)險(xiǎn)擴(kuò)散降低到最小,我們?cè)賮?lái)思考依賴倒置對(duì)并行開發(fā)的影響。兩個(gè)類之間有依賴關(guān)系,只要制定出兩者之間的接口(或抽象類)就可以獨(dú)立開發(fā)了,而且項(xiàng)目之間的單元測(cè)試也可以獨(dú)立地運(yùn)行,而TDD(Test-Driven Development,測(cè)試驅(qū)動(dòng)開發(fā))開發(fā)模式就是依賴倒置原則的最高級(jí)應(yīng)用
8、。我們繼續(xù)回顧上面司機(jī)駕駛汽車的例子,甲程序員負(fù)責(zé)IDriver的開發(fā),乙程序員負(fù)責(zé)1Car的開發(fā),兩個(gè)開發(fā)人員只要制定好了接口就可以獨(dú)立地開發(fā)了,甲開發(fā)進(jìn)度比較快,完成了IDriver以及相關(guān)的實(shí)現(xiàn)類Driver的開發(fā)工作,而乙程序員滯后開發(fā),那甲是否可以進(jìn)行單元測(cè)試呢?答案是可以,我們引人一個(gè)IMock工具,其最基本的功能是根據(jù)抽象虛擬一個(gè)對(duì)象進(jìn)行測(cè)試,測(cè)試類如代碼清單3-10所示,public class DriverTest extends TestCase Mockery context = new JUnit4Mockery(); Test public void testDriv
9、er() /根據(jù)接口虛擬一個(gè)對(duì)象 final ICar car = context.mock(ICar.class); IDriver driver = new Driver(); context.checking(new Expectations() oneOf (car).run(); ); driver.drive(car); ,抽象是對(duì)實(shí)現(xiàn)的約束,對(duì)依賴者而言,也是一種契約,不僅僅約束自己,還同時(shí)約束自己與外部的關(guān)系,其目的是保證所有的細(xì)節(jié)不脫離契約的范疇,確保約束雙方按照既定的契約(抽象)共同發(fā)展,只要抽象這根基線在,細(xì)節(jié)就脫離不了這個(gè)圈圈,始終讓你的對(duì)象做到“言必信,行必果”,三、
10、依賴的三種寫法,1.構(gòu)造函數(shù)傳遞依賴對(duì)象 在類中通過(guò)構(gòu)造函數(shù)聲明依賴對(duì)象,按照依賴注入的說(shuō)法,這種方式叫做構(gòu)造函數(shù)注入,按照這種方式的注入,IDriver和Driver的程序修改后如代碼清單3-11所示,public class Driver implements IDriver private ICar car; /構(gòu)造函數(shù)注入 public Driver(ICar _car) this.car = _car; /司機(jī)的主要職責(zé)就是駕駛汽車 public void drive() this.car.run(); ,2. Setter方法傳遞依賴對(duì)象 在抽象中設(shè)置Setter方法聲明依賴關(guān)系,
11、依照依賴注入的說(shuō)法,這是Setter依賴注入,按照這種方式的注人,IDriver和Driver的程序修改后如代碼清單3-12所示。,public class Driver implements IDriver private ICar car; public void setCar(ICar car) this.car = car; /司機(jī)的主要職責(zé)就是駕駛汽車 public void drive() this.car.run(); ,3.接口聲明依賴對(duì)象 在接口的方法中聲明依賴對(duì)象,上節(jié)的例子就采用了接口聲明依賴的方式,該方法也叫做接口注入,四、最佳實(shí)踐,依賴倒置原則的本質(zhì)就是通過(guò)抽象(接口或抽象類)使各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立,不 互相影響,實(shí)現(xiàn)模塊間的松耦合,我們?cè)趺丛陧?xiàng)目中使用這個(gè)規(guī)則呢?只要遵循以下的幾個(gè)規(guī)則就可以: 每個(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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版新型食用菌保健品區(qū)域總代銷售與售后服務(wù)合同3篇
- 二零二五年度環(huán)保節(jié)能產(chǎn)品推廣合同4篇
- 2025年陶瓷原料質(zhì)量檢測(cè)與認(rèn)證合同2篇
- 2025年度門禁系統(tǒng)設(shè)備租賃與運(yùn)營(yíng)維護(hù)協(xié)議4篇
- 二手車交易市場(chǎng)租賃合同范本2024年適用
- 二零二五年度辦公樓窗簾節(jié)能改造承包合同4篇
- 2025年度智慧停車場(chǎng)設(shè)計(jì)與運(yùn)營(yíng)服務(wù)合同4篇
- 2025年文化中心場(chǎng)地租賃合同終止及合作開發(fā)意向書3篇
- 天津市應(yīng)急保障2025年度專用車輛租賃合同2篇
- 二零二五年度土地承包經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同流轉(zhuǎn)規(guī)范版
- 2024-2025學(xué)年山東省濰坊市高一上冊(cè)1月期末考試數(shù)學(xué)檢測(cè)試題(附解析)
- 江蘇省揚(yáng)州市蔣王小學(xué)2023~2024年五年級(jí)上學(xué)期英語(yǔ)期末試卷(含答案無(wú)聽力原文無(wú)音頻)
- 數(shù)學(xué)-湖南省新高考教學(xué)教研聯(lián)盟(長(zhǎng)郡二十校聯(lián)盟)2024-2025學(xué)年2025屆高三上學(xué)期第一次預(yù)熱演練試題和答案
- 決勝中層:中層管理者的九項(xiàng)修煉-記錄
- 幼兒園人民幣啟蒙教育方案
- 單位就業(yè)人員登記表
- 衛(wèi)生監(jiān)督協(xié)管-醫(yī)療機(jī)構(gòu)監(jiān)督
- 記錄片21世紀(jì)禁愛指南
- 腰椎間盤的診斷證明書
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)七 裂變傳播
- 單級(jí)倒立擺系統(tǒng)建模與控制器設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論