對依賴注入,控制反轉,反射的理解

依賴反轉原則
設計模式中,爲了遵循開閉原則,降低類與類之間的依賴關係,又設計了依賴反轉原則:
    高層不應該依賴於低層,兩者都應該依賴於抽象;
    抽象不依賴於具象,具象依賴於抽象。
理解:如一個項目中,高層的控制邏輯直接依賴於低層的數據庫(sql), 直接在邏輯類中創建數據庫的對象,就形成了對數據庫的緊密的依賴。那麼如果用戶需要換數據庫(access),且高層邏輯完全不變,則更換數據庫時,不僅要添加擴展代碼,還要修改源碼。 但破壞開閉原則,不易維庫不易擴展不易複用不靈活吧啦吧啦。所以應該將數據庫設計個高層的抽象,即抽象類或是接口,高層依賴於抽象,根據需要從接口處創建需要的對象,低層sql和access都需要實現接口。這樣添加access的時候,只需要擴展,不修改原來的代碼即可。

反射:不用new來創建對象,而是用類加載器,根據字符串名創建類,創建類的權利轉移了,不是調用者new而是交給了IoC(inversion of control)控制容器來創建,是實現控制反轉的關鍵技術。在java中,用Assembly.Load(集合名).CreateInstance(集合名.類名)來實現反射,對象是由IoC容器根據類加載器創建的。對象不是預先創建編譯好,而是使用時動態創建。

控制反轉:利用反射技術,將對象創建權利轉移給容器,一般結合配置文件,讀取根據配置文件創建對象,省去了用來判斷創建哪個對象的switch和if語句。

依賴注入:依賴注入也是實現控制反轉的一個技術,其實我們在項目中也經常用到,即對象的實例化由別的類注入,可以是容器創建瞭然後注入,也可以是另外的類中創建後注入,不是自己創建,也是將控制權轉自給了別人。可以用構造函數也可以用set函數,如:
public class Logic{
    myDataBase db;
    public Logic(myDataBase mdb){
        db = mdb;
    }
    或
    public void setMyDatabase(myDataBase mdb){
        db = mdb;
 }
    ......
}
參數是實例化後的對象,不是自己new的,稱爲依賴注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章