最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)六大設(shè)計原則之依賴倒置原則

 更新時間:2022年02月08日 09:24:26   作者:痕跡g  
這篇文章介紹了C#實現(xiàn)六大設(shè)計原則之依賴倒置原則的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

依賴倒置原則(DIP)定義:

高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象。

問題由來:

類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達(dá)成。這種場景下,類A一般是高層模塊,

負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;假如修改類A,會給程序帶來不必要的風(fēng)險。

解決方案:

將類A修改為依賴接口I,類B和類C各自實現(xiàn)接口I,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系,則會大大降低修改類A的幾率。

ps:

依賴倒置原則基于這樣一個事實:相對于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多。以抽象為基礎(chǔ)搭建起來的架構(gòu)比以細(xì)節(jié)為基礎(chǔ)

搭建起來的架構(gòu)要穩(wěn)定的多。抽象指的是接口或者抽象類,細(xì)節(jié)就是具體的實現(xiàn)類,使用接口或者抽象類的目的是制定

好規(guī)范和契約,而不去涉及任何具體的操作,把展現(xiàn)細(xì)節(jié)的任務(wù)交給他們的實現(xiàn)類去完成。

依賴倒置原則的核心思想是面向接口編程,用一個例子來說明面向接口編程比相對于面向?qū)崿F(xiàn)編程好在什么地方。

舉個生活中的例子, 我們每天下班, 可能為了方便亦或鍛煉身體, 選擇騎單車回家, 對于現(xiàn)在單車, 又有各種各樣: mobike, ofo, 小藍(lán), 小鳴等等...

(用C#代碼表達(dá))  定義3個實現(xiàn), 分別對應(yīng)的是各種單車品牌。

public class BlueGoGo
    {
        public void Go()
        {
            Console.WriteLine("騎的是小藍(lán)單車");
        }
    }

    public class Ofo
    {
        public void Go()
        {
            Console.WriteLine("騎的是小黃單車");
        }
    }

    public class Mobike
    {
        public void Go()
        {
            Console.WriteLine("騎的是摩拜單車");
        }
    }

然后再定義一個騎行類(Ride)

//騎行類
    public class Ride
    {
        //掃碼小藍(lán)騎車
        public void ScanCodeByBlueGoGo()
        {
            BlueGoGo blue = new BlueGoGo();
            blue.Go();
        }

        //掃碼摩拜單騎車
        public void ScanCodeByMoBike()
        {
            Mobike mo = new Mobike();
            mo.Go();

        }

        //掃碼小黃騎車
        public void ScanCodeByOfo()
        {
            Ofo ofo = new Ofo();
            ofo.Go();
        }
    }

現(xiàn)在看上去確實也沒什么問題, 所以調(diào)用一下, 一切正常

仔細(xì)看看, 這個代碼確實有問題, 針對上面所講的依賴倒置原則

<類A直接依賴類B, 假如要將類A改為依賴類C,則必須通過修改類A的代碼來達(dá)成。這種場景下,類A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;假如修改類A,會給程序帶來不必要的風(fēng)險。>

正如例子中的 騎行類(Ride) 正是依賴BlueGoGo,MoBike,Ofo類, 如果現(xiàn)在 Ride類要新增一個小鳴單車, 則我們必須要修改Ride的代碼,同是添加一個XiaoMing的類達(dá)到效果。

//騎行類
    public class Ride
    {
        //掃碼小藍(lán)騎車
        public void ScanCodeByBlueGoGo()
        {
            BlueGoGo blue = new BlueGoGo();
            blue.Go();
        }

        //掃碼摩拜單騎車
        public void ScanCodeByMoBike()
        {
            Mobike mo = new Mobike();
            mo.Go();

        }

        //掃碼小黃騎車
        public void ScanCodeByOfo()
        {
            Ofo ofo = new Ofo();
            ofo.Go();
        }

        /*
         * 該功能位新增的小鳴單車, 必須修改Ride類
         */
        public void ScanCodeByXiaoMing()
        {
            XiaoMing xming = new XiaoMing();
            xming.Go();
        }
    }

像MoBike, BlueGoGo, Ofo, XiaoMing 這些類, 他們都屬于底層模塊, 負(fù)責(zé)基本的騎車的動作,  按照依賴倒置的原則, 則不應(yīng)該修改A, 否則如果在業(yè)務(wù)量很大的情況下, 則會給程序帶來不必要的潛在風(fēng)險。

用依賴導(dǎo)致的思想怎么去實現(xiàn) 新增小鳴單車而不對高層模塊進行修改?

1.將單車的每個Go動作都抽象起來, 分別讓他們?nèi)プ龈髯缘膶崿F(xiàn)。

//修改位抽象的車類
    public abstract class abstarctBike
    {
        public abstract void Go();
    }

    public class BlueGoGo: abstarctBike
    {
        public override void Go()
        {
            Console.WriteLine("騎的是小藍(lán)單車");
        }
    }

    public class Ofo : abstarctBike
    {
        public override  void Go()
        {
            Console.WriteLine("騎的是小黃單車");
        }
    }

    public class Mobike : abstarctBike
    {
        public override  void Go()
        {
            Console.WriteLine("騎的是摩拜單車");
        }
    }

    public class XiaoMing : abstarctBike
    {
        public override  void Go()
        {
            Console.WriteLine("騎的是小明單車");
        }
    }

這時, 我們再把騎行類(Ride)進行改造, 將原有的ScanCodeXXX 都棄用, 用一個全新的ScanCode提供一個抽象類型。

//騎行類
    public class Ride
    {
        //
        public void ScanCode(abstarctBike bike)
        {
            bike.Go();
        }

        /*
         *  以下位之前棄用的模式
         */

        //掃碼小藍(lán)騎車
        public void ScanCodeByBlueGoGo()
        {
            BlueGoGo blue = new BlueGoGo();
            blue.Go();
        }

        //掃碼摩拜單騎車
        public void ScanCodeByMoBike()
        {
            Mobike mo = new Mobike();
            mo.Go();

        }

        //掃碼小黃騎車
        public void ScanCodeByOfo()
        {
            Ofo ofo = new Ofo();
            ofo.Go();
        }

        /*
         * 該功能位新增的小鳴單車, 必須修改Ride類
         */
        public void ScanCodeByXiaoMing()
        {
            XiaoMing xming = new XiaoMing();
            xming.Go();
        }
    }

現(xiàn)在, 我們再調(diào)用, 只要指定給Ride對象ScanCode執(zhí)行的類型就可以實現(xiàn)騎行動作。

這樣修改后,無論以后怎樣擴展單車類,都不需要再修改Ride類了。這只是一個簡單的例子,實際情況中,代表高層模塊的Ride類將負(fù)責(zé)完成主要的業(yè)務(wù)邏輯,

一旦需要對它進行修改,引入錯誤的風(fēng)險極大。所以遵循依賴倒置原則可以降低類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低修改程序造成的風(fēng)險。

在實際編程中,我們一般需要做到如下3點:

  • 低層模塊盡量都要有抽象類或接口,或者兩者都有。
  • 變量的聲明類型盡量是抽象類或接口。
  • 使用繼承時遵循里氏替換原則。

依賴倒置原則的核心就是要我們面向接口編程,理解了面向接口編程,也就理解了依賴倒置。

到此這篇關(guān)于C#實現(xiàn)六大設(shè)計原則之依賴倒置原則的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • WPF簡單的數(shù)據(jù)庫查詢實例

    WPF簡單的數(shù)據(jù)庫查詢實例

    下面小編就為大家分享一篇WPF簡單的數(shù)據(jù)庫查詢實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • C#中的LINQ?to?Objects詳解(1)

    C#中的LINQ?to?Objects詳解(1)

    本文詳細(xì)講解了C#中的LINQ?to?Objects,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#實現(xiàn)隨鼠標(biāo)移動窗體實例

    C#實現(xiàn)隨鼠標(biāo)移動窗體實例

    這篇文章主要介紹了C#實現(xiàn)隨鼠標(biāo)移動窗體實例,主要通過簡單的窗體事件代碼即可實現(xiàn)鼠標(biāo)隨窗體移動的功能,非常簡單實用,需要的朋友可以參考下
    2014-10-10
  • C#封裝的Sqlite訪問類實例

    C#封裝的Sqlite訪問類實例

    這篇文章主要介紹了C#封裝的Sqlite訪問類,實例分析了C#針對Sqlite數(shù)據(jù)庫各種常用操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C# 改變無邊框窗體尺寸大小的方法

    C# 改變無邊框窗體尺寸大小的方法

    這篇文章介紹了C# 改變無邊框窗體尺寸大小的方法,有需要的朋友可以參考一下
    2013-10-10
  • c#測試本機sql運算速度的代碼示例分享

    c#測試本機sql運算速度的代碼示例分享

    本文代碼目的很簡單,就是使用c#測試一下本機sql運算的速度,使用循環(huán)往數(shù)據(jù)里大量插入數(shù)據(jù),計算所用時間,大家參考使用吧
    2014-01-01
  • C# 中楊輝三角的實現(xiàn)

    C# 中楊輝三角的實現(xiàn)

    這篇文章主要介紹了C# 中楊輝三角的實現(xiàn)的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • C#中單例的實現(xiàn)方法

    C#中單例的實現(xiàn)方法

    這篇文章主要介紹了C#中單例的實現(xiàn)方法,以實例形式分析了C#中單例的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#中緊耦合Tight Coupling和松耦合Loose Coupling的實現(xiàn)

    C#中緊耦合Tight Coupling和松耦合Loose Coupling的實現(xiàn)

    緊耦合和松耦合是描述模塊或組件之間耦合程度的兩個概念,本文主要介紹了C#中緊耦合Tight Coupling和松耦合Loose Coupling的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • C#使用FileStream對象讀寫文件

    C#使用FileStream對象讀寫文件

    這篇文章主要為大家詳細(xì)介紹了C#使用FileStream對象讀寫文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論

玉环县| 白城市| 屏东市| 平乡县| 临泉县| 成都市| 玉田县| 建湖县| 二连浩特市| 祁连县| 睢宁县| 永安市| 菏泽市| 陇西县| 方山县| 丰原市| 西丰县| 娄烦县| 得荣县| 新密市| 英德市| 青海省| 阳信县| 汝城县| 武陟县| 孝感市| 宁明县| 略阳县| 新乐市| 恩平市| 弥渡县| 苍溪县| 驻马店市| 库车县| 时尚| 康保县| 天镇县| 慈利县| 喀什市| 凌海市| 浙江省|