成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解IoC(控制反轉(zhuǎn))、DI(依賴注入)

xcc3641 / 2689人閱讀

摘要:引述最近看設(shè)計(jì)模式以及代碼,對(duì)于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對(duì)于控制反轉(zhuǎn)的一下理解。其中最常見的方式叫做依賴注入,簡(jiǎn)稱,還有一種方式叫依賴查找。在軟件工程中,依賴注入是種實(shí)現(xiàn)控制反轉(zhuǎn)用于解決依賴性設(shè)計(jì)模式。

引述

最近看設(shè)計(jì)模式以及l(fā)aravel代碼,對(duì)于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對(duì)于控制反轉(zhuǎn)的一下理解。

概念 IoC
控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。它把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對(duì)象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對(duì)組件對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。其中最常見的方式叫做依賴注入(Dependency Injection,簡(jiǎn)稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴的對(duì)象的引用傳遞給它。也可以說,依賴被注入到對(duì)象中。

正如概念中描述的,那么控制反轉(zhuǎn)具體指哪些 控制反轉(zhuǎn) 了呢,其實(shí)我理解的控制反轉(zhuǎn)是指程序所控制的對(duì)象的控制權(quán)交給了容器,而這個(gè)容器就是實(shí)現(xiàn)各個(gè)模塊解耦合的關(guān)鍵。IoC只是一種設(shè)計(jì)思想,主要實(shí)現(xiàn)有:

依賴查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。

依賴注入(Dependency Injection)

我們著重說一下依賴注入。

DI
在軟件工程中,依賴注入是種實(shí)現(xiàn)控制反轉(zhuǎn)用于解決依賴性設(shè)計(jì)模式。一個(gè)依賴關(guān)系指的是可被利用的一種對(duì)象(即服務(wù)提供端) 。依賴注入是將所依賴的傳遞給將使用的從屬對(duì)象(即客戶端)。該服務(wù)是將會(huì)變成客戶端的狀態(tài)的一部分。 傳遞服務(wù)給客戶端,而非允許客戶端來建立或?qū)ふ曳?wù),是本設(shè)計(jì)模式的基本要求。

以上是wikipedia上對(duì)于依賴注入的理解,下面將用實(shí)際的例子詳細(xì)講解。

舉例

加入我們?cè)O(shè)計(jì)一個(gè)通用的用戶登錄基類,可以支持多個(gè)平臺(tái)的用戶登錄
那么最糟糕的寫法是,

/**
 * A類用戶登錄
 **/
class User_A_Login
{
    public function checkALogin(){
        
    };
}

/**
 * B類用戶登錄
 **/
class User_B_Login
{
    public function checkBLogin(){
        
    };
}
/**
 * 登錄基類
 **/
class User_Login
{
    public function checkLogin($userType)
    {
        if($userType = "A"){
            $this->objAUser = new User_A_Login();
            $this->objAUser->checkALogin();
        }elseif($userType = "B"){
            $this->objBUser = new User_B_Login();
            $this->objBUser->checkBLogin();
        }
    }
}

上面的 User_Login 這個(gè)類就直接依賴于類 User_A_LoginUser_B_Login ,如果我們使用下面這種方式寫

interface User_Login_Interface
{
    public function checkLogin();
}
/**
 * A類用戶登錄
 **/
class User_A_Login implements User_Login_Interface
{
    public function checkLogin(){
        
    };
}

/**
 * B類用戶登錄
 **/
class User_B_Login implements User_Login_Interface
{
    public function checkLogin(){
        
    };
}
/**
 * 登錄基類
 **/
class User_Login
{
    public $userLogin;
    
    public function setUser(User_Login_Interface $user){
        $this->userLogin = $user;
    }
    
    public function checkLogin()
    {
        $this->userLogin->checkLogin();
    }
}

如果按照這種方式進(jìn)行構(gòu)建代碼,我們將依賴項(xiàng)User_B_Login或者User_A_Login通過函數(shù) setUser( ) 注入到類中,調(diào)用方式:

$userLogin = new User_Login();
$userLogin->setUser(new User_A_Login);
$userLogin->checkLogin();

調(diào)用方可以控制使用那個(gè)登錄類型,這就完成了對(duì)于不同登錄系統(tǒng)的依賴注入。如果你引入了一個(gè)新的用戶c,只需寫一個(gè)c的登錄類:

/**
 * C類用戶登錄
 **/
class User_C_Login implements User_Login_Interface
{
    public function checkLogin(){
        
    };
}

就可以通過:

$userLogin = new User_Login();
$userLogin->setUser(new User_C_Login);
$userLogin->checkLogin();

進(jìn)行登錄驗(yàn)證了。在實(shí)際代碼中由于基類非常復(fù)雜需要對(duì)登錄做一系列處理,所以每次添加登錄用戶不應(yīng)該去修改基類。對(duì)于一下框架例如laravel的框架是不能修改的,應(yīng)該就是通過這種方式實(shí)現(xiàn)的調(diào)用方的自定義。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28774.html

相關(guān)文章

  • 深入理解控制反轉(zhuǎn)IoC)和依賴注入DI

    摘要:本文一大半內(nèi)容都是通過舉例來讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過理解這些概念,來更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...

    HollisChuang 評(píng)論0 收藏0
  • 深入理解依賴注入

    摘要:上面這部分代碼不變,還是通過在構(gòu)造器中傳入依賴的方式初始化依賴調(diào)用這里,調(diào)用方無需了解內(nèi)部對(duì)的依賴。而配置一般用于上自動(dòng)掃描并注入的代碼如下這里只給出直接在依賴對(duì)象上添加注解的形式,還可以通過構(gòu)造器和注入依賴,這里就不多說了。 前言 相信所有面試java開發(fā)的童鞋一定都被問到過是否使用過Spring,是否了解其IOC容器,為什么不直接使用工廠模式,以及究竟IOC和DI區(qū)別在于哪里這種問...

    e10101 評(píng)論0 收藏0
  • Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解

    摘要:對(duì)象之間耦合度過高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。控制被反轉(zhuǎn)之后,獲得依賴對(duì)象的過程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...

    atinosun 評(píng)論0 收藏0
  • 深入剖析 Laravel 服務(wù)容器

    摘要:劃下重點(diǎn),服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實(shí)例化及其依賴的注入,完全由服務(wù)容器自動(dòng)的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請(qǐng)注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請(qǐng)求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...

    abson 評(píng)論0 收藏0
  • Spring IoC學(xué)習(xí)總結(jié)

    摘要:學(xué)習(xí)總結(jié)學(xué)習(xí)整理的一些筆記,很簡(jiǎn)單。大部分認(rèn)為和只是不同的叫法而已。依賴注入的兩種方式和注解使用注釋驅(qū)動(dòng)的功能源碼剖析 Spring IoC學(xué)習(xí)總結(jié) 學(xué)習(xí)spring Ioc整理的一些筆記,很簡(jiǎn)單。分享給大家。 IoC 基本概念 在這之前,我們先記住一句話。好萊塢原則:Dont call us, we will call you.其實(shí)這句話很恰當(dāng)?shù)匦稳萘朔崔D(zhuǎn)的意味;Ioc, Inve...

    silencezwm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<