走向面向?qū)ο蟮牧笤瓌t--依賴倒置原則

面向?qū)ο缶幊痰牧笤瓌t


讓項(xiàng)目擁有變化的能力--依賴倒置原則
依賴倒置原則的英文全程是Dependence Inversion Principle,縮寫是DIP咒彤,依賴倒置原則是一種特定的解耦形式三妈,使得高層次的模塊不依賴于低層次的模塊的實(shí)現(xiàn)細(xì)節(jié)的目的姨涡,依賴模塊被顛倒了先蒋。簡(jiǎn)單的說有以下幾點(diǎn):

  • 高層模塊不應(yīng)該依賴于底層模塊职恳,兩者都應(yīng)該依賴于其抽象揩尸。
  • 抽象不應(yīng)該依賴于細(xì)節(jié)蛹屿。
  • 細(xì)節(jié)應(yīng)該依賴于抽象。

在Java語言中岩榆,抽象就是指接口和抽象類错负,兩者都是不能直接被實(shí)例化的;細(xì)節(jié)就是指實(shí)現(xiàn)類勇边,實(shí)現(xiàn)接口或繼承抽象類而產(chǎn)生的類就是細(xì)節(jié)犹撒,細(xì)節(jié)可以被直接實(shí)例化。高層模塊是指調(diào)用端粒褒,低層模塊就是具體實(shí)現(xiàn)類识颊。依賴倒置原則在Java中的表現(xiàn)就是:模塊間的依賴通過抽象發(fā)生,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系奕坟,其依賴關(guān)系是通過接口或者抽象類產(chǎn)生的祥款。

在我們之前的章節(jié)中,有一章的ImageLoader是依賴于具體實(shí)現(xiàn)的月杉,代碼如下:

public class ImageLoader {
    // 內(nèi)存緩存(直接依賴于細(xì)節(jié))
    MemoryCache mMemoryCache  = new MemoryCache ();
    // 線程池刃跛,線程數(shù)為CPU所允許的數(shù)量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    //加載圖片到ImageView中
    public void displayImg(final String url, final ImageView imageView) {
    }
    //從網(wǎng)絡(luò)獲取圖片
    private Bitmap downloadImg(String imageUrl) {
    }

}

然后我們分析出該圖片加載類只有內(nèi)存緩存,已經(jīng)無法滿足我們的需求苛萎,于是我們?cè)O(shè)計(jì)出了DoubleCache類桨昙,此時(shí)便需要修改我們的代碼:

public class ImageLoader {
    // 雙緩存(直接依賴于細(xì)節(jié))
    DoubleCache mDoubleCache   = new DoubleCache ();
    // 線程池,線程數(shù)為CPU所允許的數(shù)量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    //加載圖片到ImageView中
    public void displayImg(final String url, final ImageView imageView) {
    }
    //從網(wǎng)絡(luò)獲取圖片
    private Bitmap downloadImg(String imageUrl) {
    }
}

我們將MemoryCache修改為DoubleCache腌歉,并且修改了部分緩存代碼蛙酪,就輕松地滿足了我們的需求。但是翘盖!這里就違反了我們第二章所講的開閉原則桂塞,這樣設(shè)計(jì)出來的代碼在后期需求改變時(shí)需要不停地修改,會(huì)使代碼冗余并且容易出錯(cuò)最仑。我們?cè)?a href="http://www.reibang.com/p/fd1f130b4791" target="_blank">開閉原則一章結(jié)束時(shí)的代碼就很好地解決了這個(gè)問題藐俺,一句話概括起來就是:依賴抽象,而不依賴于具體實(shí)現(xiàn)泥彤。通過依賴注入的方式欲芹,可以保證系統(tǒng)的靈活性,我們回顧一下之前的代碼(不熟悉的同學(xué)請(qǐng)回頭閱讀開閉原則:

ImageCache抽象類

public interface ImageCache {
    Bitmap get(String url);

    void put(String url,Bitmap bitmap);
}

ImageLoader類

 public class ImageLoader {
    // 圖片緩存吟吝,依賴于抽象菱父,并且有一個(gè)默認(rèn)的實(shí)現(xiàn)
    ImageCache mImageCache = new MemoryCache();

    // 設(shè)置緩存策略,依賴于抽象
    public void setmImageCache(ImageCache cache){
        mImageCache = cache;
    }

    public void displayImage(String imageUrl,ImageView imageView){
    }
}

在這里,我們建立了ImageCache抽象浙宜,并且讓ImageLoader依賴于抽象而不是具體細(xì)節(jié)官辽。當(dāng)我們的緩存策略發(fā)生改變時(shí),我們只需要實(shí)現(xiàn)ImageCache或者集成已有的ImageCache子類完成具體的代碼實(shí)現(xiàn)即可粟瞬,這樣就保證了我們的軟件的高拓展性同仆,有了變化的能力,這就是依賴倒置原則裙品。
從上述的幾節(jié)我們也發(fā)現(xiàn)俗批,好像要讓系統(tǒng)變得靈活,抽象似乎成了我們唯一的手段市怎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岁忘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子区匠,更是在濱河造成了極大的恐慌干像,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驰弄,死亡現(xiàn)場(chǎng)離奇詭異麻汰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)戚篙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門什乙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人已球,你說我怎么就攤上這事「ㄔ福” “怎么了智亮?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)点待。 經(jīng)常有香客問我阔蛉,道長(zhǎng),這世上最難降的妖魔是什么癞埠? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任状原,我火速辦了婚禮,結(jié)果婚禮上苗踪,老公的妹妹穿的比我還像新娘颠区。我一直安慰自己,他們只是感情好通铲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布毕莱。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朋截。 梳的紋絲不亂的頭發(fā)上蛹稍,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音部服,去河邊找鬼唆姐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛廓八,可吹牛的內(nèi)容都是我干的奉芦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘫想,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仗阅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起国夜,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤减噪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后车吹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筹裕,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窄驹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朝卒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐埠,死狀恐怖抗斤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丈咐,我是刑警寧澤瑞眼,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站棵逊,受9級(jí)特大地震影響伤疙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辆影,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一徒像、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛙讥,春花似錦锯蛀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽今布。三九已至,卻和暖如春拭抬,著一層夾襖步出監(jiān)牢的瞬間部默,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工造虎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傅蹂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓算凿,卻偏偏與公主長(zhǎng)得像份蝴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓轰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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