您好,登錄后才能下訂單哦!
這篇文章主要講解了“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)注!
免責(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)容。