一個例子理解ioc

今天,我斗膽給大家介紹一下IOC(Inversion Of Control)砾莱。凡是從事JAVA開發(fā)的都聽說過這個概念,因為我們都用過Spring框架瑞筐,Spring框架中核心的設計理念之一就是IOC。而這篇文章的重點是介紹IOC的設計思想腊瑟,IOC到底是怎么一步一步的演化而來的聚假。我將圍繞如下的發(fā)展流程來介紹IOC的發(fā)展歷程。

  1. 面向過程
  2. 面向對象
  3. 面向接口
  4. IOC

背景

小王是阿里媽媽集團某研發(fā)部門的高級java開發(fā)工程師闰非,轉眼間膘格,來到阿里媽媽集團已經(jīng)有3年多了。小王因扎實的Java基礎财松,豐富的開發(fā)經(jīng)驗瘪贱,帶領著開發(fā)團隊攻克了一個又一個的技術難題纱控。不僅工作上兢兢業(yè)業(yè), 而且其為人低調菜秦,不露鋒芒甜害。得到了領導和同事一致的認可和好評。兩個星期前球昨,小王做了個重要的決定"自己創(chuàng)業(yè)"尔店,因為以前在公司里不錯的口碑,在朋友那拿了一個項目主慰。這段時間準備擼起袖子大干一場闹获,搞定這個項目。

我們都知道軟件開發(fā)簡單的來說都要經(jīng)歷三個階段河哑。

  1. 需求分析
  2. 開發(fā)設計
  3. 測試上線

因為這是小王接手的第一個項目避诽,自己也沒有找到合作人,也沒有創(chuàng)業(yè)啟動資金璃谨。所以活只能小王一個人干沙庐。
如果我們將軟件開發(fā)的三個階段抽象抽代碼的話。就像下面這樣

class XiaoWangCompany {
    doProject() {
        // 需求分析
        xiaoMing.demandAnaylsis();
        // 開發(fā)設計
        xiaoMing.coding();
        // 測試上線
        xiaoMing.testAndOnline()
    }
}

小王一個人承包了所有的活佳吞,而這就是面向過程的思想拱雏,完成一個功能/一個業(yè)務邏輯的所有工作都需要開發(fā)者自己來完成。而在這個可以說小明運用了面向過程的思想完成了第一個項目底扳。這里的苦铸抑,只有小王一個人知道。但是衷模,小明通過這個項目賺到了第一桶金鹊汛。
第一個項目得到了客戶強烈的好評,客戶又幫小王介紹了第二個單子阱冶,這個單子可是一個大單子刁憋。小王知道自己一個人沒法完成這么大的項目,于是請來了需求分析工程師木蹬,小張至耻,開發(fā)工程師,小劉镊叁,測試工程師尘颓,小麗。 而小王主要負責商務洽談晦譬,項目管理疤苹。
在做第二個項目的時候,軟件開發(fā)過程就會變成這樣蛔添。

class XiaoWangCompany {
    
    public XiaoWangCompany() {
        XiaoZhang xiaoZhang = new XiaoZhang();
        XiaoLiu xiaoLiu = new XiaoLiu();
        XiaoLi xiaoLi = new XiaoLi();
    }

    doProject() {
        // 小張做需求分析
        xiaoZhang.demandAnaylsis();
        // 小劉做開發(fā)設計
        xiaoLiu.coding();
        // 小麗做測試上線
        xiaoLi.testAndOnline()
    }
}

注意這個時候痰催,小王已經(jīng)不參與具體的項目開發(fā)兜辞,而做項目的是小張,小劉夸溶,小麗逸吵,小王已經(jīng)由具體的項目具體的實現(xiàn)者變成了項目調度者,小王調用小張缝裁,小劉扫皱,小麗的不同功能,按照一定業(yè)務邏輯捷绑,協(xié)同配合完成一個項目的開發(fā)韩脑。而這就是面向對象的核心思想。借助已有的類來完成相應的功能粹污。從程序的執(zhí)行者變?yōu)榱顺绦虻恼{度者段多。
第二個項目也很順利,小王通過前兩次的項目開發(fā)積累了豐富的經(jīng)驗壮吩。幸運女神是站在小王這邊的进苍,小王很快接道了第三個項目⊙夹穑可是這次沒前兩次這么順利了觉啊。工程師小劉因為這兩天的流感肆虐得了重感冒。在家臥床修養(yǎng)沈贝。這可急壞了小王杠人。沒辦法情急之下。小王托老朋友幫他找來了一個開發(fā)工程師小趙宋下。才得以度過危機嗡善。小王開始做反思了,怎么才能解決這樣的問題呢杨凑?滤奈?于是靈機一動想了個好辦法。抽象成代碼就是這樣的撩满。

interface demandAnalysisable {
   demandAnaylsis();
}
interface codeable{
  coding();
}
interface testable{
  testAndOnline();
}

class XiaoZhang implements demandAnalysisable {
    @Override
    demandAnaylsis() {  ... }
}

class XiaoLiu implements codeable {
    @Override
    coding() {  ... }
}

class XiaoLi implements testable {
    @Override
    testAndOnline() {  ... }
}

class XiaoWangCompany {
    public XiaoWangCompany() {
        DemandAnalysisable xiaoZhang = new XiaoZhang();
        Codeable xiaoLiu = new XiaoLiu();
        Testable xiaoLi = new XiaoLi();
    }
    doProject() {
        // 小張做需求分析
        xiaoZhang.demandAnaylsis();
        // 小劉做開發(fā)設計
        xiaoLiu.coding();
        // 小麗做測試上線
        xiaoLi.testAndOnline()
    }
}

這時候可算是大功告成了,小王再也不用擔心绅你,因為某一個員工突然病倒伺帘,導致一個項目無法再進行下去,而這就是面向接口核心思想忌锯,小王不再依賴某個具體的人來完成某項工作了伪嫁,假設某一天小劉臨時有事沒法來上班,那么完全可以找到偶垮,和小劉職責相同的劉二张咳,劉三來代替小劉來完成編碼的工作就可以了帝洪。是不是很爽:)
可是小王覺得這還不是一個最好的解決辦法。因為還有一個問題沒有解決脚猾〈邢浚總不能每次有員工臨時請假都由小王來安排其他人來接替請假的人來完成工作把?龙助?于是小王又想了一個辦法砰奕,不如,招一個HR提鸟,讓TA來頂替自己來完成人力管理的任務军援。以后不管誰請假了,直接交由HR來幫小王完成人力分配的工作称勋。好了完事大吉了胸哥。這個辦法可以一勞永逸了。
而這里的HR就相當于一個IOC容器赡鲜。這時候的人力資源即小張空厌,小劉,小麗不再需要由小王來管理蝗蛙,而交由HR來管理蝇庭。這樣就實現(xiàn)了人力資源的控制反轉。
關于控制反轉我再多插兩句捡硅,這四個字要拆成兩個詞來理解哮内。1:控制 2:反轉。所謂的控制就是小王對小張壮韭,小劉北发,小麗的調度,分配的權力喷屋。相當于客戶端對對象的控制琳拨。而反轉值得是將小王對小張,小劉屯曹,小麗的控制反轉給了HR狱庇,即IOC容器,交由TA來統(tǒng)一管理恶耽。
雖然沒有從具體的代碼層面去深入理解IOC密任,但是通過這個例子,我相信大家都可以輕而易舉的理解IOC的思想內(nèi)涵偷俭。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浪讳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涌萤,更是在濱河造成了極大的恐慌淹遵,老刑警劉巖口猜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異透揣,居然都是意外死亡济炎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門淌实,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冻辩,“玉大人,你說我怎么就攤上這事拆祈『奚粒” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵放坏,是天一觀的道長咙咽。 經(jīng)常有香客問我,道長淤年,這世上最難降的妖魔是什么钧敞? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮麸粮,結果婚禮上溉苛,老公的妹妹穿的比我還像新娘。我一直安慰自己弄诲,他們只是感情好愚战,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齐遵,像睡著了一般寂玲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗摇,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天拓哟,我揣著相機與錄音,去河邊找鬼伶授。 笑死断序,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的糜烹。 我是一名探鬼主播逢倍,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼景图!你這毒婦竟也來了?” 一聲冷哼從身側響起碉哑,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挚币,失蹤者是張志新(化名)和其女友劉穎亮蒋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妆毕,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡慎玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笛粘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁怔。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖薪前,靈堂內(nèi)的尸體忽然破棺而出润努,到底是詐尸還是另有隱情,我是刑警寧澤示括,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布铺浇,位于F島的核電站,受9級特大地震影響垛膝,放射性物質發(fā)生泄漏鳍侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一吼拥、第九天 我趴在偏房一處隱蔽的房頂上張望倚聚。 院中可真熱鬧,春花似錦凿可、人聲如沸惑折。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唬复。三九已至,卻和暖如春全肮,著一層夾襖步出監(jiān)牢的瞬間敞咧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工辜腺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休建,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓评疗,卻偏偏與公主長得像测砂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子百匆,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,112評論 25 707
  • 用兩張圖告訴你砌些,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,723評論 2 59
  • 《青春的困惑》 不知從什么時候起,人們的觀念開始悄悄轉變存璃。有人告訴我仑荐,說是年紀長了,心志在變纵东。不知是否每個人都認同...
    點點星燈閱讀 439評論 0 0
  • 如果上一篇文章《親愛的偎球,你有多久沒畫畫了洒扎?》對你有所觸動,但直至今天的你仍舊未拿起畫筆衰絮,可能是因為關于畫畫袍冷,還有另...
    漫話時光閱讀 671評論 0 4
  • 清晨,金色的太陽光芒灑滿了大地岂傲, 地面上有幾只小麻雀時不時跳躍著覓著食难裆。 冬爺貌似在二月三日就已草草結束它的行程,...
    樂天的雜貨鋪閱讀 829評論 0 2