亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

對依賴倒置原則(DIP)及Ioc、DI、Ioc容器的一些理解

2019-11-14 21:02:27
字體:
來源:轉載
供稿:網友
對依賴倒置原則(Dip)及Ioc、DI、Ioc容器的一些理解1、概述

所謂依賴倒置原則(Dependence Inversion PRinciple)就是要依賴于抽象,不要依賴于具體。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合,并由此引申出IoC、DI以及Ioc容器等概念。

2、意圖面向過程的開發,上層調用下層,上層依賴于下層,當下層劇烈變動時上層也要跟著變動,這就會導致模塊的復用性降低而且大大提高了開發的成本。面向對象的開發很好的解決了這個問題,一般情況下抽象的變化概率很小,讓用戶程序依賴于抽象,實現的細節也依賴于抽象。即使實現細節不斷變動,只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實現細節的耦合度。3、正文

依賴倒置原則(DIP):一種軟件架構設計的原則(抽象概念)。

控制反轉(IoC):一種反轉流、依賴和接口的方式(DIP的具體實現方式)。

依賴注入(DI):IoC的一種實現方式,用來反轉依賴(IoC的具體實現方式)。

IoC容器:依賴注入的框架,用來映射依賴,管理對象創建和生存周期(DI框架)。

一個一個來說吧,首先先來了解下"依賴倒置原則(DIP)":

舉個生活中的小例子:

取過錢的朋友都知道,只要我們手上有一張銀行卡,我們就可以到各個銀行的ATM機上去取款,在這個場景中ATM機器屬于高層模塊,我們手上的銀行卡屬于底層模塊。

在ATM機上提供了一個卡槽插口(接口),供各種銀行卡插入使用,在這里ATM機不依賴于具體的哪種銀行卡,它只規定了銀行卡的規格,只要我們手上的銀行卡滿足這個規格參數,我們就可以使用它。

轉換下概念,也就是:

高層模塊不依賴于底層模塊,而底層模塊依賴于高層模塊的接口(高層模塊定義接口,底層模塊負責實現)。

高層模塊(接口):抽象  底層模塊(實現接口):實現 ==>兩者應該依賴于抽象,抽象(高層)不依賴實現(底層),實現(底層)依賴于抽象(高層)。

再來舉個例子:

1、如果依賴不倒置將會出現:高層模塊依賴于底層模塊,也就是說底層變成了抽象,高層需要實現抽象出來的所有接口,一旦底層出現新的模塊,則就需要去修改高層的模塊,破壞了開放-封閉原則。

2、如果依賴倒置將會出現:底層模塊依賴于高層模塊,也就是說高層變成了抽象,底層只需要去實現高層的接口就行,一旦底層出現新的模塊,則高層模塊就不需要去修改(定義抽象接口不變)。

由此可見DIP的優點:

系統更柔韌:可以修改一部分代碼而不影響其他模塊。

系統更健壯:可以修改一部分代碼而不會讓系統崩潰。

系統更高效:組件松耦合,且可復用,提高開發效率。

接下來說下"控制反轉(Ioc)":

DIP是一種軟件設計原則,是告訴我們模塊之間應該是怎樣的一種關系,那Ioc就是具體的一種軟件設計模式,告訴我們應該如何去做,才能做到程序間的解耦。

Ioc(控制反轉)為高、低層模塊之間提供了抽象,也就是第三方系統,也就是依賴對象(底層對象)不在依賴的模塊中(高層模塊)中直接創建對象,而是把創建對象的權利交給第三次Ioc容器來創建,然后再把對象交給依賴模塊(聯想剛剛取錢的例子,ATM機器是高層模塊,它自身并沒有決定要插入哪個銀行的銀行卡,比如建行,農行,要插入什么卡的決定權在于我們(也就是第三方),我們插入什么行的卡,它就給我們什么銀行的服務)。

來個具體代碼感受下Ioc的好處:(訂單系統,底層操縱類是基于MySQL數據庫的)

MysqlHelper.java(數據庫操作類)

 1 package com.lcw.dip.test; 2  3 public class MysqlHelper { 4      5     public void add(){ 6         System.out.println("增加訂單.."); 7     } 8  9     public void delete(){10         System.out.println("刪除訂單..");11     }12     13     public void update(){14         System.out.println("修改訂單..");15     }16     17     public void find(){18         System.out.println("查詢訂單..");19     }20 }

Order.java(業務邏輯類)

 1 package com.lcw.dip.test; 2  3 public class Order { 4     private MysqlHelper helper = new MysqlHelper(); 5  6     public void addOrder() { 7         this.helper.add(); 8     } 9     10     public void delOrder(){11         this.helper.delete();12     }13     14     public void updateOrder(){15         this.helper.update();16     }17     18     public void FindOrder(){19         this.helper.find();20     }21 }

DipTest.java(測試類)

package com.lcw.dip.test;/** *DIP(Dependence Inversion Principle)依賴倒置原則 * @author Balla_兔子 * */public class DipTest {    public static void main(String[] args) {        Order order=new Order();        order.addOrder();    }}

看下操作效果:

Perfect,完美?。?/p>

但如果現在突然業務需求要改換成access數據庫,這時改怎么辦呢?

傳統的做法,我們需要再去編寫一個關于Access的數據庫操縱類,然后修改下Order類里的代碼,把實例化對象修改成Access類(new Access())。

那要是過幾天又要改成Oracle數據庫呢?

。。。。。反反復復,周而復始,煩!

有沒有什么辦法可以解決這個繁瑣的問題呢?答案是必須有!不然我就不用打這么多字了~~

接下來依賴注入(DI)就派上用場了:

依賴注入是實現Ioc的一種重要方式,將依賴的對象的創建權交給外部(第三方)來處理,而不是在自身new出一個實例。

例如上面的添加訂單例子,我們在創建數據庫操縱對象的時候是在Order類中直接new出,這樣有個很不好的地方就是,一旦數據庫變動,則我們還要去修改Order類,很顯然這是不可取的,違反了開放-封閉原則 。

那我們應該怎么做呢?答案很明顯就是利用DI(依賴注入),將創建對象的權利交給外部(第三方)實現,然后再傳遞給需要調用對象的模塊,也就是高層模塊。

傳遞注入的方式有三種:

1、構造注入:顧名思義利用構造方法注入

2、setter方法注入:在需要注入的類里提供一個setter方法

3、接口注入:因為具有代碼侵入性,一般很少用,前2種居多

說了這么多,上代碼直接看實例吧

DbHelper.java

 1 package com.lcw.dip.test; 2  3 public class DbHelper { 4      5     public void add(){ 6         System.out.println("增加訂單.."); 7     } 8  9     public void delete(){10         System.out.println("刪除訂單..");11     }12     13     public void update(){14         System.out.println("修改訂單..");15     }16     17     public void find(){18         System.out.println("查詢訂單..");19     }20 }

Order.java

 1 package com.lcw.dip.test; 2  3 public class Order { 4     //private MysqlHelper helper = new MysqlHelper(); 5     private DbHelper helper; 6     public Order(DbHelper helper){//提供構造方法,注入屬性 7         this.helper=helper; 8     } 9 10     public void addOrder() {11         this.helper.add();12     }13     14     public void delOrder(){15         this.helper.delete();16     }17     18     public void updateOrder(){19         this.helper.update();20     }21     22     public void FindOrder(){23         this.helper.find();24     }25 }

DipTest.java

 1 package com.lcw.dip.test; 2  3 /** 4  *DIP(Dependence Inversion Principle)依賴倒置原則 5  * @author Balla_兔子 6  * 7  */ 8 public class DipTest { 9     public static void main(String[] args) {10         //Order order=new Order();11         DbHelper helper=new DbHelper();12         Order order=new Order(helper);//注入DbHelper對象13         order.addOrder();14     }15 16 }

效果依舊,這樣就很方便我們下次修改了,比如我們要換成Access數據庫,那么這次我們只需要去修改數據庫操縱類DbHelper就可以了,就不必要去動Order類了。

再來看下利用setter方法的注入:

DbHelper.java 數據庫操作底層類不變

Order.java

 1 package com.lcw.dip.test; 2  3 public class Order { 4 //    private MysqlHelper helper = new MysqlHelper(); 5 //    private DbHelper helper; 6 //    public Order(DbHelper helper){//提供構造方法,注入屬性 7 //        this.helper=helper; 8 //    } 9     10     private DbHelper helper;11     public void setHelper(DbHelper helper) {12         this.helper = helper;13     }14 15     public void addOrder() {16         this.helper.add();17     }18     19     public void delOrder(){20         this.helper.delete();21     }22     23     public void updateOrder(){24         this.helper.update();25     }26     27     public void FindOrder(){28         this.helper.find();29     }30 }

DipTest.java

 1 package com.lcw.dip.test; 2  3 /** 4  *DIP(Dependence Inversion Principle)依賴倒置原則 5  * @author Balla_兔子 6  * 7  */ 8 public class DipTest { 9     public static void main(String[] args) {10 //        Order order=new Order();11 //        DbHelper helper=new DbHelper();12 //        Order order=new Order(helper);//注入DbHelper對象13         DbHelper helper=new DbHelper();14         Order order=new Order();15         order.setHelper(helper);16         order.addOrder();17     }18 19 }

效果依舊:

最后來說下關于Ioc容器:

在上面的例子中,我們都是通過手動的方式來創建依賴對象,然后在手動傳遞給被依賴模塊(高層),但對于大型的項目來說,各個組件之間的依賴關系式非常復雜的,如果我們還是用手動來創建依賴對象并且手動注入是個相當繁雜的一個工作,而且還容易出錯,甚至出現不可控狀態。

因此Ioc容器就這樣誕生了,也就是DI的一個框架,用來簡化我們的操作,Ioc容器可以做到動態創建、注入對象,對象的生命周期管理,映射依賴關系等。

Ioc容器有很多比如:PicoContainer,JBoss Microcontainer,Soto,Spring等。

總結一下:

DIP是軟件設計的一種思想,IoC則是基于DIP衍生出的一種軟件設計模式。

DI是IoC的具體實現方式之一,使用最為廣泛。

IoC容器是DI注入的框架,它管理著依賴項的生命周期以及映射關系。

作者:Balla_兔子出處:http://www.49028c.com/lichenwei/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得準,我分文不收;相不準,你也好回來找我!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产suv精品一区二区三区88区| 69视频在线免费观看| 国产精品夫妻激情| 亚洲精品第一页| 精品视频偷偷看在线观看| 色婷婷av一区二区三区在线观看| 久久久久久久国产精品| 日韩a**站在线观看| 激情av一区二区| 日韩国产在线播放| 精品动漫一区二区| 欧美一性一乱一交一视频| 亚洲精品国产精品久久清纯直播| 亚洲福利在线播放| 日韩av一区二区在线| 亚洲天堂男人天堂女人天堂| 久久久亚洲网站| 91精品国产99久久久久久| 国产免费一区二区三区在线能观看| 日本中文字幕久久看| 91九色国产社区在线观看| 高清欧美性猛交xxxx黑人猛交| 国产亚洲人成网站在线观看| 丝袜美腿亚洲一区二区| 亚洲日本成人女熟在线观看| 午夜美女久久久久爽久久| 日韩免费观看在线观看| 国产日韩欧美黄色| 亚洲欧洲免费视频| 亚洲精品v欧美精品v日韩精品| 欧美精品在线第一页| 久久精品国产电影| 日韩精品在线观看视频| 亚洲欧美激情四射在线日| 色樱桃影院亚洲精品影院| 欧美高跟鞋交xxxxhd| 国产精品一区二区久久| 日本精品免费一区二区三区| 欧美日韩国产页| 国产在线观看不卡| 一区三区二区视频| 欧美一区在线直播| 久青草国产97香蕉在线视频| 亚洲国产高清自拍| 一级做a爰片久久毛片美女图片| 不卡毛片在线看| xvideos成人免费中文版| 欧美在线视频观看免费网站| 亚洲最新av在线| 欧美自拍视频在线观看| 狠狠操狠狠色综合网| 北条麻妃一区二区在线观看| 亚洲欧美色婷婷| 中文日韩电影网站| 日本成人精品在线| 欧美另类极品videosbest最新版本| 在线视频日韩精品| 久久久国产视频91| 日韩精品极品视频| 日韩精品有码在线观看| 操91在线视频| 91超碰中文字幕久久精品| 久久久久久久色| 欧美成人手机在线| 精品视频—区二区三区免费| 日韩少妇与小伙激情| 欧美中文在线字幕| 国产一区二区三区在线免费观看| 亚洲开心激情网| 亚洲精品国产美女| 欧美在线视频免费观看| 亚洲香蕉在线观看| 日韩在线高清视频| 色偷偷888欧美精品久久久| 国产精品第一区| 亚洲欧美国产va在线影院| 久久精品国产电影| 中文字幕日韩av综合精品| 国产区亚洲区欧美区| 亚洲天堂一区二区三区| 一个人看的www久久| 狠狠躁夜夜躁人人躁婷婷91| 欧美另类99xxxxx| 亚洲国产精品人人爽夜夜爽| 3344国产精品免费看| 日韩男女性生活视频| 国产精品免费久久久久影院| 国产精品爽爽ⅴa在线观看| 国产精品视频午夜| 欧美日韩电影在线观看| 日韩av影片在线观看| 久久视频精品在线| 91高清免费在线观看| 国产香蕉一区二区三区在线视频| 国产精品精品久久久| 免费97视频在线精品国自产拍| 亚洲国产成人精品久久久国产成人一区| 国产精品色悠悠| 美乳少妇欧美精品| 国产一区二区在线播放| 日韩电影中文字幕| 成人激情av在线| 久久久久日韩精品久久久男男| 欧美激情精品久久久久久蜜臀| 国产丝袜精品第一页| 亚洲欧美日韩国产中文| 日韩视频免费中文字幕| 日韩高清人体午夜| 日本精品久久电影| 欧美激情乱人伦一区| 国产精品久久久久7777婷婷| 亚洲天堂av在线免费| 国产做受69高潮| 91高潮精品免费porn| 久青草国产97香蕉在线视频| 亚洲国产99精品国自产| 亚洲乱码一区av黑人高潮| 亚洲free嫩bbb| 欧美在线观看日本一区| 欧美成年人视频网站| 国产九九精品视频| 中文字幕国产亚洲2019| 国产成人91久久精品| 国产美女精品免费电影| 亚洲精品国产精品自产a区红杏吧| 一区二区亚洲欧洲国产日韩| 亚洲色图色老头| 亚洲欧美日韩中文视频| 久久精品久久久久久| 久久久久久伊人| 欧美夫妻性生活视频| 国产精品日韩专区| 亚洲日本欧美中文幕| 国产精品中文在线| 国产精品麻豆va在线播放| 亚洲性69xxxbbb| 这里只有精品丝袜| 亚洲一区二区三区四区视频| 欧美午夜性色大片在线观看| 久久影视电视剧凤归四时歌| 美日韩精品视频免费看| 亚洲视频专区在线| 欧美大片在线免费观看| 疯狂蹂躏欧美一区二区精品| 欧美日韩精品中文字幕| 全亚洲最色的网站在线观看| 在线观看日韩欧美| 精品一区二区三区电影| 91深夜福利视频| 久久青草精品视频免费观看| 国产日韩欧美电影在线观看| 色与欲影视天天看综合网| 国产视频福利一区| 国产精品视频资源| 日韩中文第一页| 久久大大胆人体| 欧美wwwxxxx| 国内精品国产三级国产在线专| 国模吧一区二区| 欧美自拍视频在线观看| 亚洲国产欧美一区二区丝袜黑人| 高清视频欧美一级| 久久成人这里只有精品| 亚洲精品一区二区在线|