什么是依賴注入
依賴注入(Dependency Injection),是這樣一個(gè)過程:某客戶類只依賴于服務(wù)類的一個(gè)接口,而不依賴于具體服務(wù)類,所以客戶類只定義一個(gè)注入點(diǎn)。在程序運(yùn)行過程中,客戶類不直接實(shí)例化具體服務(wù)類實(shí)例,而是客戶類的運(yùn)行上下文環(huán)境或?qū)iT組件負(fù)責(zé)實(shí)例化服務(wù)類,然后將其注入到客戶類中,保證客戶類的正常運(yùn)行。
什么是控制反轉(zhuǎn)
在解釋什么是控制反轉(zhuǎn)的之前我們先引入上一篇博文一個(gè)博友在評(píng)論中提的問題:依賴注入和控制反轉(zhuǎn)不是一回事嗎?
在我看來,控制反轉(zhuǎn)這種思想最終的實(shí)現(xiàn)要依賴與依賴注入這種實(shí)現(xiàn)方式。控制反轉(zhuǎn)只是把高低層的關(guān)系發(fā)生變化,以前底層模塊在實(shí)現(xiàn)功能的時(shí)候可能會(huì)依賴于高層模塊,通過控制反轉(zhuǎn)可以讓底層模塊依賴于一個(gè)接口,如果這個(gè)時(shí)候高層模塊要使用底層模塊的話就必須
實(shí)現(xiàn)這個(gè)接口,然后通過依賴注入的方式把高層模塊的實(shí)現(xiàn)類注冊(cè)到底層模塊中使用。
有可能上面的解釋大家比較懵,下面我會(huì)通過舉例來進(jìn)一步介紹控制反轉(zhuǎn)這種設(shè)計(jì)模式。
一個(gè)例子理解控制反轉(zhuǎn)
從上圖可以看出駕駛者依賴“汽車“和“火車”這兩個(gè)類,如果駕駛員需要開汽車話的就需要實(shí)例化一個(gè)汽車類,需要開火車的話則需要實(shí)例化一個(gè)火車類
//開汽車
汽車 cat=new 汽車();
cat.Stop();
//開火車省略。。
這個(gè)時(shí)候如果說我們需要開飛機(jī)怎么辦?傳統(tǒng)做法則是新建一個(gè)飛機(jī)類,然后在駕駛者直接實(shí)例化飛機(jī)類即可。
我們暫把上圖的框架成為“自動(dòng)駕駛系統(tǒng)”,現(xiàn)在“自動(dòng)駕駛系統(tǒng)”已經(jīng)擁有了自動(dòng)開汽車、開飛機(jī)、開火車的功能了,你覺得已經(jīng)很強(qiáng)大了,于是把這套系統(tǒng)賣給了某個(gè)公司,但是這家公司的業(yè)務(wù)不僅限于前三種交通工具,現(xiàn)在這家公司要實(shí)現(xiàn)駕駛者可以駕駛飛船,如下圖所示
大家可以看到如果我們的“自動(dòng)駕駛系統(tǒng)”要實(shí)現(xiàn)可以駕駛飛船的話,就需要駕駛者創(chuàng)建“飛船”的對(duì)象,這個(gè)時(shí)候我們的框架還是依賴于外部(因?yàn)轱w船類在客戶那邊)。這個(gè)就是我們常說的底層模塊依賴于高級(jí)模塊。這種依賴肯定是不行的,隨著客戶的變化就要改動(dòng)我們的框架,這種做法肯定不行,我們繼續(xù)演變。
現(xiàn)在我們的駕駛者并不直接依賴于某個(gè)具體實(shí)現(xiàn)類,而且依賴于接口,但是這個(gè)時(shí)候上圖就暴露了一個(gè)問題,希望大家先不要看下面的文字,大家可以先思考下上圖有什么問題。(上圖三個(gè)交通工具和接口的關(guān)系標(biāo)識(shí)錯(cuò)了,應(yīng)該是實(shí)現(xiàn))
上圖的設(shè)計(jì)雖然解決了不用New具體那個(gè)對(duì)象的問題,但是新的問題也隨之而來:駕駛者到底使用哪個(gè)實(shí)現(xiàn)類?大家都知道接口是不能直接實(shí)例化的,能夠?qū)嵗闹挥薪涌诘木唧w的實(shí)現(xiàn)類。OK,為了解決這個(gè)問題我們繼續(xù)演變
上圖我們使用工廠模式,這時(shí)候的關(guān)系是駕駛者依賴與工廠類,由工廠類具體去創(chuàng)建具體的實(shí)現(xiàn)類。根據(jù)上圖我們?cè)倏慈绻覀儗?shí)現(xiàn)開飛船,那么它們之間的關(guān)系會(huì)發(fā)生什么樣的變化(上圖三個(gè)交通工具和接口的關(guān)系標(biāo)識(shí)錯(cuò)了,應(yīng)該是實(shí)現(xiàn))
通過一系列演化,現(xiàn)在兩者之間的關(guān)系已經(jīng)徹底發(fā)生了改變,以前是底層模塊(框架)依賴于高層模塊,現(xiàn)在變成了高層模塊依賴于底層模塊,從上圖可以看出,無論你是要開飛船還是開火箭,只要你實(shí)現(xiàn)了“交通工具”接口,那么我就可以在工廠類里面給創(chuàng)建出來。這樣一來不僅增加了我們系統(tǒng)的可擴(kuò)展性,也提高了我們系統(tǒng)的整體穩(wěn)健型。
最后來總結(jié)一下到底什么是控制反轉(zhuǎn),我的答案已經(jīng)在文章開頭給出了,下面給出維基百科的答案:
控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο?a target="_blank">編程中的一種設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡(jiǎn)稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴的對(duì)象的引用傳遞給它。也可以說,依賴被注入到對(duì)象中。
編輯:hfy
-
面向?qū)ο?/span>
+關(guān)注
關(guān)注
0文章
64瀏覽量
10013 -
控制反轉(zhuǎn)
+關(guān)注
關(guān)注
0文章
1瀏覽量
936
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
PLC控制電機(jī)正反轉(zhuǎn)的物聯(lián)網(wǎng)解決方案
![PLC<b class='flag-5'>控制</b>電機(jī)正<b class='flag-5'>反轉(zhuǎn)</b>的物聯(lián)網(wǎng)解決方案](https://file1.elecfans.com//web2/M00/0C/D2/wKgaomc8Q_iAOrcRAAIIOlvG5KE495.png)
什么是電機(jī)正反轉(zhuǎn)?電機(jī)正反轉(zhuǎn)主要應(yīng)用在哪些方面?
無刷電機(jī)正反轉(zhuǎn)由什么控制
如何將行程開關(guān)接入正反轉(zhuǎn)控制電路
ESP32控制舵機(jī)的正反轉(zhuǎn)原理是什么
變頻器控制電機(jī)的正反轉(zhuǎn)與控制方式有哪些?
簡(jiǎn)單介紹plc如何控制電機(jī)正反轉(zhuǎn)
兩相正反轉(zhuǎn)開關(guān)怎么接線方法
v20變頻器控制電機(jī)反轉(zhuǎn)怎么調(diào)
PLC控制電動(dòng)機(jī)正反轉(zhuǎn)電路的工作原理
PLC如何判斷編碼器正反轉(zhuǎn)
步進(jìn)電機(jī)的正反轉(zhuǎn)實(shí)現(xiàn)方法
直流電機(jī)正反轉(zhuǎn)的控制方式
什么是離子注入?離子注入的應(yīng)用介紹
![什么是離子<b class='flag-5'>注入</b>?離子<b class='flag-5'>注入</b>的應(yīng)用介紹](https://file1.elecfans.com/web2/M00/C0/63/wKgZomXVX9aABagEAABFeGeWQRo401.png)
評(píng)論