溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java設(shè)計(jì)模式的依賴倒置原則怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-03-31 15:27:49 來(lái)源:億速云 閱讀:198 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“java設(shè)計(jì)模式的依賴倒置原則怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“java設(shè)計(jì)模式的依賴倒置原則怎么實(shí)現(xiàn)”吧!

依賴倒置原則(Dependence Inversion Principle),簡(jiǎn)稱DIP

定義

High level modules should depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

1、高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴于抽象(抽象類或接口)

2、抽象(抽象類或接口)不應(yīng)該依賴于細(xì)節(jié)(具體實(shí)現(xiàn)類)

3、細(xì)節(jié)(具體實(shí)現(xiàn)類)應(yīng)該依賴抽象

抽象:即抽象類或接口,兩者是不能夠?qū)嵗摹?/p>

細(xì)節(jié):即具體的實(shí)現(xiàn)類,實(shí)現(xiàn)接口或者繼承抽象類所產(chǎn)生的類,兩者可以通過(guò)關(guān)鍵字new直接被實(shí)例化。

而依賴倒置原則的本質(zhì)騎士就是通過(guò)抽象(抽象類或接口)使各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立,不相互影響,實(shí)現(xiàn)模塊間的松耦合。但是這個(gè)原則也是6個(gè)設(shè)計(jì)原則中最難以實(shí)現(xiàn)的了,如果沒(méi)有實(shí)現(xiàn)這個(gè)原則,那么也就意味著開閉原則(對(duì)擴(kuò)展開發(fā),對(duì)修改關(guān)閉)也無(wú)法實(shí)現(xiàn)。

依賴倒置有三種方式來(lái)實(shí)現(xiàn)

1、通過(guò)構(gòu)造函數(shù)傳遞依賴對(duì)象

比如在構(gòu)造函數(shù)中的需要傳遞的參數(shù)是抽象類或接口的方式實(shí)現(xiàn)。

2、通過(guò)setter方法傳遞依賴對(duì)象

即在我們?cè)O(shè)置的setXXX方法中的參數(shù)為抽象類或接口,來(lái)實(shí)現(xiàn)傳遞依賴對(duì)象

3、接口聲明實(shí)現(xiàn)依賴對(duì)象

例如下面的例子

涂涂是個(gè)女僧

public class Tutu {      //涂涂是個(gè)女孩,會(huì)煮面      public void cook(Noodles noodles)      {          noodles.eat();      }  }

面條(目前只會(huì)煮面)

public class Noodles {      //吃面條      public void eat()      {          System.out.println("涂涂吃面條...");      }  }

涂涂坐在家里吃面(場(chǎng)景類)

public class Home {      public static void main(String args[])      {          Tutu tutu = new Tutu();          Noodles food = new Noodles();          tutu.cook(food);      }  }

運(yùn)行結(jié)果:涂涂吃面條...

但是這有個(gè)問(wèn)題,涂涂只會(huì)做面條,不可能每次都吃面條吧,天天吃面吃死你,所以在上面的Tutu類中的cook方法中,如果涂涂會(huì)做其他吃的,那豈不是更好。于是她向家庭主婦邁進(jìn)了一步,使用了依賴倒置原則。

也就是涂涂通過(guò)學(xué)習(xí)還可以燜米飯,炒魷魚(雖然聽著不爽,但是很好吃),京醬肉絲啊等等。要想在代碼中實(shí)現(xiàn),就需要實(shí)現(xiàn)兩個(gè)接口:ITutu和IFood

public interface ITutu {      //這樣就會(huì)做很多飯菜了      public void cook(IFood food);  }

實(shí)現(xiàn)類

public class Tutu implements ITutu {         @Override     public void cook(IFood food) {          food.eat();      }     }

食物接口

public interface IFood {      public void eat();  }

這樣就為擴(kuò)展留出了很大的空間,方面擴(kuò)展其他的類。也不會(huì)對(duì)細(xì)節(jié)有變動(dòng)。以后涂涂想吃什么學(xué)一下就可以自己做了

實(shí)現(xiàn)面條

public class Noodles implements IFood {         @Override     public void eat() {          System.out.println("涂涂吃面條...");      }     }

實(shí)現(xiàn)米飯

public class Rice implements IFood {         @Override     public void eat() {          System.out.println("涂涂吃米飯(終于吃上米飯了)...");      }  }

場(chǎng)景類:涂涂在家里開吃了,想吃什么直接做就是了

public class Home {      public static void main(String args[])      {          //接口使不能實(shí)例化滴          ITutu tutu = new Tutu();          //實(shí)例化米飯,涂涂可以吃米飯了          IFood rice = new Rice();          //吃面條          //IFood noodles = new Noodles();          tutu.cook(rice);      }  }

這樣各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立,不互相影響,實(shí)現(xiàn)了。

感謝各位的閱讀,以上就是“java設(shè)計(jì)模式的依賴倒置原則怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)java設(shè)計(jì)模式的依賴倒置原則怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI