IoC就是Inversion of Control,控制反轉(zhuǎn)。在Java開(kāi)發(fā)中,IoC意味著將你設(shè)計(jì)好的類(lèi)交給系統(tǒng)去控制,而不是在你的類(lèi)內(nèi)部控制。這稱(chēng)為控制反轉(zhuǎn)。
下面我們以幾個(gè)例子來(lái)說(shuō)明什么是IoC。假設(shè)我們要設(shè)計(jì)一個(gè)Girl和一個(gè)Boy類(lèi),其中Girl有kiss方法,即Girl想要Kiss一個(gè)Boy。那么,我們的問(wèn)題是,Girl如何能夠認(rèn)識(shí)這個(gè)Boy?
在我們中國(guó),常見(jiàn)的MM與GG的認(rèn)識(shí)方式有以下幾種:1青梅竹馬;2親友介紹;3父母包辦。 那么哪一種才是更好呢?
青梅竹馬:Girl從小就知道自己的Boy。
public class Girl ...{
void kiss()...{
Boy boy = new Boy();
}
}
然而從開(kāi)始就創(chuàng)建的Boy缺點(diǎn)就是無(wú)法在更換。并且要負(fù)責(zé)Boy的整個(gè)生命周期。如果我們的Girl想要換一個(gè)怎么辦?(筆者嚴(yán)重不支持Girl經(jīng)常更換Boy) 親友介紹:由中間人負(fù)責(zé)提供Boy來(lái)見(jiàn)面。
public class Girl ...{
void kiss()...{
Boy boy = BoyFactory.createBoy();
}
}
親友介紹,固然是好。如果不滿意,盡管另外換一個(gè)好了。但是,親友BoyFactory經(jīng)常是以Singleton的形式出現(xiàn),不然就是,存在于Globals,無(wú)處不在,無(wú)處不能。實(shí)在是太繁瑣了一點(diǎn),不夠靈活。我為什么一定要這個(gè)親友摻和進(jìn)來(lái)呢?為什么一定要付給她介紹費(fèi)呢?萬(wàn)一我的好朋友愛(ài)上了我的男朋友呢?
父母包辦:一切交給父母,自己不用費(fèi)吹灰之力,只需要等著Kiss就好了。
public class Girl ...{
void kiss(Boy boy)...{
// kiss boy
boy.kiss();
}
}
Well,這是對(duì)Girl非常好的方法,只要想辦法賄賂了Girl的父母,并把Boy交給他。那么我們就可以輕松的和Girl來(lái)Kiss了??磥?lái)幾千年傳統(tǒng)的父母之命還真是有用哦。至少Boy和Girl不用自己瞎忙乎了。
這就是IOC,將對(duì)象的創(chuàng)建和獲取提取到外部。由外部容器提供需要的組件。
我們知道好萊塢原則:“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy。
我們還應(yīng)該知道依賴(lài)倒轉(zhuǎn)原則即 Dependence Inversion Princinple,DIP。Eric Gamma說(shuō),要面向抽象編程。面向接口編程是面向?qū)ο蟮暮诵摹?/p>
組件應(yīng)該分為兩部分,即Service, 所提供功能的聲明Implementation, Service的實(shí)現(xiàn)好處是:多實(shí)現(xiàn)可以任意切換,防止 “everything depends on everything” 問(wèn)題.即具體依賴(lài)于具體。
所以,我們的Boy應(yīng)該是實(shí)現(xiàn)Kissable接口。這樣一旦Girl不想kiss可惡的Boy的話,還可以kiss可愛(ài)的kitten和慈祥的grandmother。