Java 依賴倒置 控制反轉(zhuǎn)

軟件開發(fā)六大設(shè)計(jì)原則 合稱SOLID

依賴倒置原則也是其中一個(gè)

依賴倒置原則定義:

  1. 上層模塊不應(yīng)該依賴底層模塊扩氢,它們都應(yīng)該依賴于抽象爷辱。
  2. 抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象双饥。

比較晦澀弟断,如同軟件行業(yè)中的哲學(xué)
其中上層模塊與下層模塊

  • 業(yè)務(wù)層 邏輯層 數(shù)據(jù)層
    業(yè)務(wù)層中的軟件真正要進(jìn)行的操作,就是做什么昏翰,或者叫面向用戶層
    邏輯層是軟件現(xiàn)階段為了業(yè)務(wù)層的需求提供的實(shí)現(xiàn)細(xì)節(jié)刘急,也就是怎么做
    數(shù)據(jù)層指業(yè)務(wù)層和邏輯層所需要的數(shù)據(jù)模型

什么是抽象和細(xì)節(jié)?

抽象如其名字一樣叔汁,是一件很抽象的事物。抽象往往是相對(duì)于具體而言的码邻,具體可以被稱為細(xì)節(jié)另假,當(dāng)然也可以被稱為具象。
比如 抽象可以是畫开睡,而國畫苟耻,油畫,素描就是具體
具體映射到軟件開發(fā)中凶杖,抽象可以是接口或者抽象類形式

public interface Driveable{
    void drive();
}
class Bike implements Driveable{
    @Override           注解 標(biāo)識(shí)子類對(duì)父類方法的重載,在沒有abstract
    public void drive() {
        // TODO Auto-generated method stub
        System.out.println("Bike drive.");
    }

}

class Car implements Driveable{

    @Override
    public void drive() {
        // TODO Auto-generated method stub
        System.out.println("Car drive.");
    }

}

Driveable就是抽象腾么,然后 bike car 就是細(xì)節(jié)。

依賴倒置的好處

比如一個(gè)類person攘须,在傳統(tǒng)編碼中是要什么給什么殴泰,引入什么對(duì)象
要出門,則三種交通工具都引入捞魁,作為成員變量离咐。
這就是依賴于細(xì)節(jié)了,而且在交通方式變更中開銷會(huì)很大宵蛀。

public class Person {

//  private Bike mBike;
//  private Car mCar;
//  private Train mTrain;
    private Driveable mDriveable;

    public Person() {
        //mBike = new Bike();
        //mCar = new Car();
        //mTrain = new Train();
        mDriveable = new Train();
    }

    public void chumen() {
        System.out.println("出門了");
        //mBike.drive();
        //mCar.drive();
        //mTrain.drive();
        mDriveable.drive();
    }

}
所以 倒置過來 加入一層抽象
讓人依賴于抽象术陶,改,只需要改抽象瞳别,引入只需要引入抽象 再實(shí)例化即可

抽象不應(yīng)該依賴細(xì)節(jié)杭攻,細(xì)節(jié)應(yīng)該依賴于抽象

什么是控制反轉(zhuǎn)

Inversion of Control

public class Person {

    private Driveable mDriveable;

    public Person(Driveable driveable) {

        this.mDriveable = driveable;
    }

    public void chumen() {
        System.out.println("出門了");

        mDriveable.drive();
    }

}
也就是說 不讓person創(chuàng)建對(duì)象 而是留一個(gè)接口兆解,讓外側(cè)創(chuàng)建實(shí)例并傳遞進(jìn)去

把內(nèi)部依賴的創(chuàng)建權(quán)力移交給外部,只關(guān)注依賴提供的功能锅睛,但并不關(guān)心依賴的創(chuàng)建
IoC離不開IoC的容器,也就是實(shí)例化抽象的地方

public class Restaurant {

    public static void peican(int orderid,int flowid) {
        WaimaiYuan person;
        Food food;

        if ( orderid == 0) {
            food = new PijiuYa();
        } else {
            food = new DuojiaoYutou();
        }

        if ( flowid % 2 == 0 ) {
            person = new Xiaohuozi(food);
        } else {
            person = new XiaoGuniang(food);
        }

        person.songWaiMai();

    }

}
比如例子中的Restaurant就是一個(gè)Ioc容器 
配置 一詞比較重要
Spring相關(guān)度比較高

IoC模式最核心的地方就是在依賴方與被依賴方之間辣垒,引入了第三方印蔬,這個(gè)第三方統(tǒng)稱為IoC容器,因?yàn)镮oC容器的介入例驹,導(dǎo)致上層模塊對(duì)于它的依賴的實(shí)例化控制權(quán)發(fā)生變化,也就是所謂的控制反轉(zhuǎn)的意思荤胁。

依賴注入 Dependency Injection

其實(shí)也是講我們移交出對(duì)于依賴實(shí)例化的控制權(quán)屎债,和IoC類似,并留有接口扔茅,在需要該依賴的時(shí)候注入進(jìn)去injection

  • 實(shí)現(xiàn)依賴注入有三種方式:
    1.構(gòu)造函數(shù)中注入
    2.setter方式注入
    3.接口注入

接口的存在召娜,表明了一種依賴配置的能力

在軟件框架中,讀取xml配置文件玖瘸,或者利用反射技術(shù)讀取注解,然后根據(jù)配置信息璃诀,框架動(dòng)態(tài)將一些依賴配置給特定的接口類蔑匣,我們也可以說injector也依賴于接口,而不是特定的實(shí)現(xiàn)類裁良,這樣進(jìn)一步提高了準(zhǔn)確性與靈活性

總結(jié)

  1. 依賴倒置是面向?qū)ο箝_發(fā)領(lǐng)域中的軟件設(shè)計(jì)原則价脾,它倡導(dǎo)上層模塊不依賴于底層模塊,抽象不依賴細(xì)節(jié)侨把。
  2. 依賴反轉(zhuǎn)是遵守依賴倒置這個(gè)原則而提出來的一種設(shè)計(jì)模式,它引入了 IoC 容器的概念获枝。
  3. 依賴注入是為了實(shí)現(xiàn)依賴反轉(zhuǎn)的一種手段之一骇笔。
  4. 它們的本質(zhì)是為了代碼更加的“高內(nèi)聚,低耦合”机隙。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末有鹿,一起剝皮案震驚了整個(gè)濱河市谎脯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌源梭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠卷,死亡現(xiàn)場離奇詭異烛愧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慎冤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門沧卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但狭,“玉大人,你說我怎么就攤上這事立磁。” “怎么了掂咒?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵迈喉,是天一觀的道長温圆。 經(jīng)常有香客問我,道長得运,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任饱搏,我火速辦了婚禮置逻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鬓催。我一直安慰自己恨锚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布课舍。 她就那樣靜靜地躺著他挎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雇盖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天贸街,我揣著相機(jī)與錄音狸相,去河邊找鬼脓鹃。 笑死逸尖,一個(gè)胖子當(dāng)著我的面吹牛瘸右,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苞俘,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃谣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岗憋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤陷揪,失蹤者是張志新(化名)和其女友劉穎杂穷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飞蚓,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廊蜒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年山叮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脑又。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐借,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钞翔,到底是詐尸還是另有隱情,我是刑警寧澤哮笆,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布汰扭,位于F島的核電站,受9級(jí)特大地震影響启具,放射性物質(zhì)發(fā)生泄漏珊泳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一薯演、第九天 我趴在偏房一處隱蔽的房頂上張望秧了。 院中可真熱鬧,春花似錦验毡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椰苟,卻和暖如春树叽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背题诵。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工仇轻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篷店。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓疲陕,卻偏偏與公主長得像方淤,于是被迫代替她去往敵國和親蹄殃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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