【物件導向設計】控制反轉IoC

王曉斌發表於2014-03-09

控制反轉(Inversion of Control, IoC),是物件導向變成中的一種設計原則,可以用來減少代價之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection, DI),還有一種方法依賴查詢(Dependency Lookup)。通過控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。

起源:

大多數應用程式都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個物件都需要與其合作的物件(也就是它所依賴的物件)的引用。如果這個獲取過程要靠自身實現,那麼這將導致程式碼高度耦合並且難以維護和除錯。

技術描述:

Class A中用到了Class B的物件b,一般情況下,需要在A的程式碼中顯示的new一個B的物件。

採用依賴注入技術之後,A的程式碼只需要定義一個私有的B物件,不需要直接new來獲得這個物件,而是通過相關的容器控制程式來將B物件在外部new出來bingo注入到A類裡的引用中。而具體獲取的方法、物件被獲取時的狀態由配置檔案(如XML)來指定。

實現方法:

實現控制反轉主要有兩種方式:依賴注入和依賴查詢。兩者的區別在於,前者是被動的接受物件,在類A的例項建立過程中即建立了依賴的B物件,通過型別或名稱來判斷將不同的物件注入到不同的不同的屬性中,而後者是主動索取響應名稱的物件,獲得依賴物件的時間也可以在程式碼中自由控制。

1 依賴注入:

依賴注入有如下實現方式:

基於介面:實現特定介面以供外部容器注入所依賴型別的物件。

基於set方法:實現特定屬性的public set方法,來讓外部容器呼叫傳入所依賴型別的物件。

基於建構函式:實現特定引數的建構函式,在新建物件時傳入所依賴型別的物件。

基於註解:基於java的註解功能,在私有變數前加“@Autowired”等註解,不需要顯示的定義以上三中程式碼,便可以讓外部容器傳入物件的容器。該方案相當於定義了public的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的藉口。

2 依賴查詢:

依賴查詢更加主動,在需要的時候通過呼叫框架提供的方法來獲取物件,獲取時需要提供相關的配置檔案路key等資訊來確定獲取物件的狀態。

控制反轉應用例項:

1 Java:

Spring Framework


相關文章