IoC模式簡單學習

2021-07-31 20:16:18 字數 3015 閱讀 4511

1.依賴

依賴就是有聯絡,有地方使用到它就是有依賴它,乙個系統不可能完全避免依賴。如果你的乙個類或者模組在專案中沒有用到它,恭喜你,可以從專案中剔除它或者排除它了,因為沒有乙個地方會依賴它。下面看乙個簡單的示例:

///

public class operationmain

}///

public class player

}/// /// **檔案

///

public class mediafile}

複製**

player依賴mediafile

operationmain依賴player

operationmain依賴mediafile

2.依賴倒置

耦合關係就是依賴關係,如果依賴關係相當繁雜,牽一髮而動全身,很難維護;依賴關係越少,耦合關係就越低,系統就越穩定,所以我們要減少依賴。

幸虧robert martin大師提出了物件導向設計原則—-依賴倒置原則:   

a. 上層模組不應該依賴於下層模組,它們共同依賴於乙個抽象。  

b. 抽象不能依賴於具象,具象依賴於抽象。

理解:a.上層是使用者,下層是被使用者,這就導致的結果是上層依賴下層了,下層變動了,自然就會影響到上層了,導致系統不穩定,甚至是牽一髮而動全身。那怎麼減少依賴呢?就是上層和下層都去依賴另乙個抽象,這個抽象比較穩定,整個就來說就比較穩定了。

b.物件導向程式設計時面向抽象或者面向藉口程式設計,抽象一般比較穩定,實現抽象的具體肯定是要依賴抽象的,抽象不應該去依賴別的具體,應該依賴抽象。

根據原則如下改動:

player依賴mediafile,好辦,讓player和mediafile都去依賴乙個抽象imediafile

operationmain依賴player,好辦,讓operationmain和player都依賴乙個抽象iplayer

operationmain依賴mediafile,好辦,讓operationmain和mediafile都依賴乙個抽象imediafile

iplayer不能依賴具體mediafile,應該依賴於具體mediafile的抽象imediafile

結構很簡單,於是**大致如下:

複製**

///

public class operationmain

}///

public inte***ce iplayer

///

public class player : iplayer

}/// /// **檔案

///

public inte***ce imediafile

}/// /// 預設**檔案

///

public class mediafile : imediafile}

複製**

我們可以通過反射來建立,把具體的檔名寫在配置檔案裡,這時候客戶端**也不用變了,只需要改配置檔案就好了,穩定性又有了提高,如下:

複製**

public void playmedia()

複製**

這個具物件是哪乙個,全由配置檔案來控制了,這個具體物件的控制權交給了配置檔案了,這也是人們常說的控制反轉。

控制反轉ioc是inversion of control的縮寫,是說物件的控制權進行轉移,轉移到第三方,比如轉移交給了ioc容器,它就是乙個建立工廠,你要什麼物件,它就給你什麼物件,有了ioc容器,依賴關係就變了,原先的依賴關係就沒了,它們都依賴ioc容器了,通過ioc容器來建立它們之間的關係。

4.依賴注入(di)

上面說到控制反轉,是乙個思想概念,但是也要具體實現的,上面的配置檔案也是一種實現方式。依賴注入提出了具體的思想。

依賴注入di是dependency injection縮寫,它提出了「哪些東東的控制權被反轉了,被轉移了?」,它也給出了答案:「依賴物件的建立獲得被反轉」。

所謂依賴注入,就是由ioc容器在執行期間,動態地將某種依賴關係注入到物件之中。

上面的示例中,哪些要依賴注入,依賴物件需要獲得例項的地方,即 playmedia方法,需要iplayer具體物件和imediafile的具體物件,找到了地方就從這裡下手,為了靈活的控制這兩個物件,必須是外面能夠控制著兩個物件的例項化,提供對外的操作是必要的,可以是屬性,可以是方法,可以是建構函式,總之別的地方可以控制它,下面將會使用unity來注入,使用的是建構函式注入,**如下:

複製**

///

public class operationmain

public void playmedia()

}///

public inte***ce iplayer

///

public class player : iplayer

}/// /// **檔案

///

public inte***ce imediafile

}/// /// 預設**檔案

///

public class mediafile : imediafile}

複製**

給 operationmain類乙個建構函式,因為unity有乙個建構函式注入,呼叫**如下:

複製**

static unitycontainer container = new unitycontainer();

static void init()

static void main(string args)

複製**

看出來吧,unity的功能遠不止這些,你可以初始化時註冊n多,以後直接使用,而不用使用new,還有例項週期的控制、配置檔案等靈活控制,具體可以看看unity(具體不是本節的範疇)的說明。

5.小結

通過乙個小例子由淺入深地進行優化,已加深對ioc模式的理解,我想複雜的結構也是從這種簡單的架構累加起來的。

自己對ioc模式理解還很淺,希望得到各位的指點。

設計模式 IOC

1.實際控制類中,建構函式中 引數是 介面型別 2.註冊的哪個類實現的介面,在實際控制類中就應用哪個類中的方法 具體依賴抽象 togglebar依賴render才能正常工作,但render的構造卻不受它控制,它把控制權交給了具體的使用者,這就是控制反轉。render通過構造方法傳入,這個就叫依賴注入...

Spring的IOC容器簡單介紹 工廠模式解耦

spring中有乙個重要的元件,ioc容器。ioc就是 inverse of control 控制反轉。我們在程式中經常去呼叫別的物件,這個時候就會對呼叫的物件產生依賴,我們程式的耦合性就會變高。程式的耦合大致分為類與類之間的依賴,方法與方法之間的依賴。這裡拿類與類之間的依賴為例,我們在a類中需要b...

php 簡單ioc容器

inte ce supermoduleinte ce class xpower implements supermoduleinte ce 終極炸彈 就這麼俗 class ultrabomb implements supermoduleinte ce class superman class con...