今天,我斗膽給大家介紹一下IOC(Inversion Of Control)砾莱。凡是從事JAVA開發(fā)的都聽說過這個概念,因為我們都用過Spring框架瑞筐,Spring框架中核心的設計理念之一就是IOC。而這篇文章的重點是介紹IOC的設計思想腊瑟,IOC到底是怎么一步一步的演化而來的聚假。我將圍繞如下的發(fā)展流程來介紹IOC的發(fā)展歷程。
- 面向過程
- 面向對象
- 面向接口
- IOC
背景
小王是阿里媽媽集團某研發(fā)部門的高級java開發(fā)工程師闰非,轉眼間膘格,來到阿里媽媽集團已經(jīng)有3年多了。小王因扎實的Java基礎财松,豐富的開發(fā)經(jīng)驗瘪贱,帶領著開發(fā)團隊攻克了一個又一個的技術難題纱控。不僅工作上兢兢業(yè)業(yè), 而且其為人低調菜秦,不露鋒芒甜害。得到了領導和同事一致的認可和好評。兩個星期前球昨,小王做了個重要的決定"自己創(chuàng)業(yè)"尔店,因為以前在公司里不錯的口碑,在朋友那拿了一個項目主慰。這段時間準備擼起袖子大干一場闹获,搞定這個項目。
我們都知道軟件開發(fā)簡單的來說都要經(jīng)歷三個階段河哑。
- 需求分析
- 開發(fā)設計
- 測試上線
因為這是小王接手的第一個項目避诽,自己也沒有找到合作人,也沒有創(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)涵偷俭。