設(shè)計(jì)模式 之 依賴倒置原則

今天看了一下設(shè)計(jì)模式的依賴倒置原則,覺(jué)得這個(gè)原則真的是太好了宠互,如果按這個(gè)原則去開(kāi)發(fā)的話浴讯,以后在維護(hù)項(xiàng)目功能的時(shí)候,一定會(huì)省很多事,會(huì)很大程度上降低類與類之間的耦合尔邓,當(dāng)軟件增加新功能時(shí)晾剖,修改或者增加時(shí)也不會(huì)影響原來(lái)類的邏輯,會(huì)很大程度上降低修改程序所造成的風(fēng)險(xiǎn)梯嗽,增強(qiáng)軟件的穩(wěn)定性.

下面就根據(jù)我自己的理解給大家給大家簡(jiǎn)要說(shuō)一下

定義:高層模塊不應(yīng)該依賴低層模塊齿尽,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié)灯节;細(xì)節(jié)應(yīng)該依賴抽象(聽(tīng)起來(lái)很復(fù)雜的樣子循头,等會(huì)看了代碼就會(huì)清晰很多了


問(wèn)題由來(lái):類A直接依賴類B绵估,假如要將類A改為依賴類C,則必須通過(guò)修改類A的代碼來(lái)達(dá)成卡骂。這種場(chǎng)景下国裳,類A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯:類B和類C是低層模塊全跨,負(fù)責(zé)基本的原子操作缝左;假如修改類A,會(huì)給程序帶來(lái)不必要的風(fēng)險(xiǎn)浓若。


解決方案:將類A修改為依賴接口I渺杉,類B和類C各自實(shí)現(xiàn)接口I,類A通過(guò)接口I間接與類B或者類C發(fā)生聯(lián)系挪钓,則會(huì)大大降低修改類A的幾率是越。
依賴倒置原則基于這樣一個(gè)事實(shí):相對(duì)于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多碌上。以抽象為基礎(chǔ)搭建起來(lái)的架構(gòu)比以細(xì)節(jié)為基礎(chǔ)搭建起來(lái)的架構(gòu)要穩(wěn)定的多倚评。在java中,抽象指的是接口或者抽象類馏予,細(xì)節(jié)就是具體的實(shí)現(xiàn)類天梧,使用接口或者抽象類的目的是制定好規(guī)范和契約,而不去涉及任何具體的操作霞丧,把展現(xiàn)細(xì)節(jié)的任務(wù)交給他們的實(shí)現(xiàn)類去完成腿倚。

依賴倒置原則的核心思想是面向接口編程,我們依舊用一個(gè)例子來(lái)說(shuō)明面向接口編程比相對(duì)于面向?qū)崿F(xiàn)編程好在什么地方蚯妇。場(chǎng)景是這樣的敷燎,母親給孩子講故事,只要給她一本書箩言,她就可以照著書給孩子講故事了硬贯。代碼如下:

class Book{
    public String getContent(){
        return "很久很久以前有一個(gè)阿拉伯的故事……";
    }
}

class Mother{
    public void narrate(Book book){
        System.out.println("媽媽開(kāi)始講故事");
        System.out.println(book.getContent());
    }
}

public class Client{
    public static void main(String[] args){
        Mother mother = new Mother();
        mother.narrate(new Book());
    }
} 
運(yùn)行結(jié)果:
媽媽開(kāi)始講故事
很久很久以前有一個(gè)阿拉伯的故事……

我們的程序正在肆無(wú)忌憚的運(yùn)行著,每天悠哉悠哉的陨收,突然有一天......
需求開(kāi)始變化了 需求變成這樣:不是給書而是給一份報(bào)紙饭豹,讓這位母親講一下報(bào)紙上的故事,報(bào)紙的代碼如下:

class Newspaper{
    public String getContent(){
        return "林書豪38+7領(lǐng)導(dǎo)尼克斯擊敗湖人……";
    }
} 

這位母親卻辦不到务漩,因?yàn)樗尤徊粫?huì)讀報(bào)紙上的故事拄衰,這太荒唐了,只是將書換成報(bào)紙饵骨,居然必須要修改Mother才能讀翘悉。假如以后需求換成雜志呢?換成網(wǎng)頁(yè)呢居触?還要不斷地修改Mother妖混,這顯然不是好的設(shè)計(jì)老赤。原因就是Mother與Book之間的耦合性太高了,必須降低他們之間的耦合度才行制市。
我們引入一個(gè)抽象的接口IReader抬旺。讀物,只要是帶字的都屬于讀物:

interface IReader{
    public String getContent();
} 
//Mother類與接口IReader發(fā)生依賴關(guān)系祥楣,而Book和Newspaper都屬于讀物的范疇开财,他們各自都去實(shí)現(xiàn)IReader接口,這樣就符合依賴倒置原則了误褪,代碼修改為:
class Newspaper implements IReader {
    public String getContent(){
        return "林書豪17+9助尼克斯擊敗老鷹……";
    }
}
class Book implements IReader{
    public String getContent(){
        return "很久很久以前有一個(gè)阿拉伯的故事……";
    }
}

class Mother{
    public void narrate(IReader reader){
        System.out.println("媽媽開(kāi)始講故事");
        System.out.println(reader.getContent());
    }
}

public class Client{
    public static void main(String[] args){
        Mother mother = new Mother();
        mother.narrate(new Book());
        mother.narrate(new Newspaper());
    }
}
運(yùn)行結(jié)果:
媽媽開(kāi)始講故事
很久很久以前有一個(gè)阿拉伯的故事……
媽媽開(kāi)始講故事
林書豪17+9助尼克斯擊敗老鷹……

這樣修改后床未,無(wú)論以后怎樣擴(kuò)展Client類,都不需要再修改Mother類了振坚。這只是一個(gè)簡(jiǎn)單的例子,實(shí)際情況中斋扰,代表高層模塊的Mother類將負(fù)責(zé)完成主要的業(yè)務(wù)邏輯渡八,一旦需要對(duì)它進(jìn)行修改,引入錯(cuò)誤的風(fēng)險(xiǎn)極大传货。所以遵循依賴倒置原則可以降低類之間的耦合性屎鳍,提高系統(tǒng)的穩(wěn)定性,降低修改程序造成的風(fēng)險(xiǎn)问裕。


采用依賴倒置原則給多人并行開(kāi)發(fā)帶來(lái)了極大的便利逮壁,比如上例中,原本Mother類與Book類直接耦合時(shí)粮宛,Mother類必須等Book類編碼完成后才可以進(jìn)行編碼窥淆,因?yàn)镸other類依賴于Book類。修改后的程序則可以同時(shí)開(kāi)工巍杈,互不影響忧饭,因?yàn)镸other與Book類一點(diǎn)關(guān)系也沒(méi)有。參與協(xié)作開(kāi)發(fā)的人越多筷畦、項(xiàng)目越龐大词裤,采用依賴導(dǎo)致原則的意義就越重大。現(xiàn)在很流行的TDD開(kāi)發(fā)模式就是依賴倒置原則最成功的應(yīng)用鳖宾。


傳遞依賴關(guān)系有三種方式吼砂,以上的例子中使用的方法是接口傳遞,另外還有兩種傳遞方式:構(gòu)造方法傳遞和setter方法傳遞鼎文,相信用過(guò)Spring框架的渔肩,對(duì)依賴的傳遞方式一定不會(huì)陌生。
在實(shí)際編程中拇惋,我們一般需要做到如下3點(diǎn):
● 低層模塊盡量都要有抽象類或接口赖瞒,或者兩者都有女揭。
● 變量的聲明類型盡量是抽象類或接口。
● 使用繼承時(shí)遵循里氏替換原則栏饮。
依賴倒置原則的核心就是要我們面向接口編程吧兔,理解了面向接口編程,也就理解了依賴倒置袍嬉。

好了境蔼,就先說(shuō)到這里吧!設(shè)計(jì)模式中的這些原則真正在項(xiàng)目中運(yùn)用才能發(fā)揮其作用伺通,理論只是幫助我們以后更好的去實(shí)踐箍土,實(shí)戰(zhàn)才是最重要的,但也不能輕視一些理論知識(shí)罐监,希望能和大家共勉吴藻!一起進(jìn)步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弓柱,隨后出現(xiàn)的幾起案子沟堡,更是在濱河造成了極大的恐慌,老刑警劉巖矢空,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航罗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屁药,警方通過(guò)查閱死者的電腦和手機(jī)粥血,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酿箭,“玉大人复亏,你說(shuō)我怎么就攤上這事$缘眨” “怎么了蜓耻?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)械巡。 經(jīng)常有香客問(wèn)我刹淌,道長(zhǎng),這世上最難降的妖魔是什么讥耗? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任有勾,我火速辦了婚禮,結(jié)果婚禮上古程,老公的妹妹穿的比我還像新娘蔼卡。我一直安慰自己,他們只是感情好挣磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布雇逞。 她就那樣靜靜地躺著荤懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘砸。 梳的紋絲不亂的頭發(fā)上节仿,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音掉蔬,去河邊找鬼廊宪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛女轿,可吹牛的內(nèi)容都是我干的箭启。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛉迹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傅寡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起北救,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荐操,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扭倾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挽绩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年膛壹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唉堪。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡模聋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唠亚,到底是詐尸還是另有隱情链方,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布灶搜,位于F島的核電站祟蚀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏割卖。R本人自食惡果不足惜前酿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹏溯。 院中可真熱鬧罢维,春花似錦、人聲如沸丙挽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至平窘,卻和暖如春吓肋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背初婆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工蓬坡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磅叛。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓屑咳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弊琴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兆龙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說(shuō)敲董,即一個(gè)類...
    viva158閱讀 764評(píng)論 0 1
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計(jì)模式六...
    Bloo_m閱讀 707評(píng)論 0 7
  • 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因紫皇。通俗的說(shuō),即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)腋寨。 ...
    Jabir_Zhang閱讀 641評(píng)論 0 3
  • title: 設(shè)計(jì)模式簡(jiǎn)介categories: 設(shè)計(jì)模式tags: 設(shè)計(jì)模式date: 2017-05-03 0...
    九命丿相柳閱讀 581評(píng)論 0 0
  • 上圖是手機(jī)簡(jiǎn)單調(diào)了一下出來(lái)的效果聪铺,然后給大家上原圖 圖片是在翻朋友圈的時(shí)候看到的,就想著保存下來(lái)自己處理一下萄窜,看看...
    白果說(shuō)話閱讀 611評(píng)論 0 3