1. 程式人生 > >java開發面試題詳解:舉例說明什麼是IoC

java開發面試題詳解:舉例說明什麼是IoC

IoC就是Inversion of Control,控制反轉。在Java開發中,IoC意味著將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉。

下面我們以幾個例子來說明什麼是IoC。假設我們要設計一個Girl和一個Boy類,其中Girl有kiss方法,即Girl想要Kiss一個Boy。那麼,我們的問題是,Girl如何能夠認識這個Boy?

在我們中國,常見的MM與GG的認識方式有以下幾種:1青梅竹馬;2親友介紹;3父母包辦。 那麼哪一種才是更好呢?青梅竹馬:Girl從小就知道自己的Boy。

public class Girl ...{ void kiss()...{Boy boy = new Boy();}}

然而從開始就建立的Boy缺點就是無法在更換。並且要負責Boy的整個生命週期。如果我們的Girl想要換一個怎麼辦?(筆者嚴重不支援Girl經常更換Boy) 親友介紹:由中間人負責提供Boy來見面。

public class Girl ...{void kiss()...{Boy boy = BoyFactory.createBoy(); }}

親友介紹,固然是好。如果不滿意,儘管另外換一個好了。但是,親友BoyFactory經常是以Singleton的形式出現,不然就是,存在於Globals,無處不在,無處不能。實在是太繁瑣了一點,不夠靈活。我為什麼一定要這個親友摻和進來呢?為什麼一定要付給她介紹費呢?萬一我的好朋友愛上了我的男朋友呢? 父母包辦:一切交給父母,自己不用費吹灰之力,只需要等著Kiss就好了。

public class Girl ...{void kiss(Boy boy)...{// kiss boy boy.kiss();}}

Well,這是對Girl非常好的方法,只要想辦法賄賂了Girl的父母,並把Boy交給他。那麼我們就可以輕鬆的和Girl來Kiss了。看來幾千年傳統的父母之命還真是有用哦。至少Boy和Girl不用自己瞎忙乎了。 這就是IOC,將物件的建立和獲取提取到外部。由外部容器提供需要的元件。 我們知道好萊塢原則:"Do not call us, we will call you." 意思就是,You, girlie, do not call the boy. We will feed you a boy。 我們還應該知道依賴倒轉原則即 Dependence Inversion Princinple,DIP。Eric Gamma說,要面向抽象程式設計。面向介面程式設計是面向物件的核心。

元件應該分為兩部分,即Service, 所提供功能的宣告Implementation, Service的實現好處是:多實現可以任意切換,防止 "everything depends on everything" 問題.即具體依賴於具體。 所以,我們的Boy應該是實現Kissable介面。這樣一旦Girl不想kiss可惡的Boy的話,還可以kiss可愛的kitten和慈祥的grandmother。