<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 面向對象設計原則之依賴倒轉原則 如果說開閉原則是面向對象設計的目標的話,那么依賴倒轉原則就是面向對象設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是Robert C. Martin在1996年為“C++Reporter”所寫的專欄Engineering Notebook的第三篇,后來加入到他在2002年出版的經典著作“Agile Software Development, Principles, Patterns, and Practices”一書中。依賴倒轉原則定義如下: 依賴倒轉原則(Dependency Inversion Principle, DIP):抽象不應該依賴于細節,細節應當依賴于抽象。換言之,要針對接口編程,而不是針對實現編程。 依賴倒轉原則要求我們在程序代碼中傳遞參數時或在關聯關系中,盡量引用層次高的抽象層類,即使用接口和抽象類進行變量類型聲明、參數類型聲明、方法返回類型聲明,以及數據類型的轉換等,而不要用具體類來做這些事情。為了確保該原則的應用,一個具體類應當只實現接口或抽象類中聲明過的方法,而不要給出多余的方法,否則將無法調用到在子類中增加的新方法。 在引入抽象層后,系統將具有很好的靈活性,在程序中盡量使用抽象層進行編程,而將具體類寫在配置文件中,這樣一來,如果系統行為發生變化,只需要對抽象層進行擴展,并修改配置文件,而無須修改原有系統的源代碼,在不修改的情況下來擴展系統的功能,滿足開閉原則的要求。 在實現依賴倒轉原則時,我們需要針對抽象層編程,而將具體類的對象通過依賴注入(DependencyInjection, DI)的方式注入到其他對象中,依賴注入是指當一個對象要與其他對象發生依賴關系時,通過抽象來注入所依賴的對象。常用的注入方式有三種,分別是:構造注入,設值注入(Setter注入)和接口注入。構造注入是指通過構造函數來傳入具體類的對象,設值注入是指通過Setter方法來傳入具體類的對象,而接口注入是指通過在接口中聲明的業務方法來傳入具體類的對象。這些方法在定義時使用的是抽象類型,在運行時再傳入具體類型的對象,由子類對象來覆蓋父類對象。 擴展 軟件工程大師Martin Fowler在其文章Inversion of Control Containers and the Dependency Injection pattern中對依賴注入進行了深入的分析,參考鏈接: http://martinfowler.com/articles/injection.html 下面通過一個簡單實例來加深對依賴倒轉原則的理解: Sunny軟件公司開發人員在開發某CRM系統時發現:該系統經常需要將存儲在TXT或Excel文件中的客戶信息轉存到數據庫中,因此需要進行數據格式轉換。在客戶數據操作類中將調用數據格式轉換類的方法實現格式轉換和數據庫插入操作,初始設計方案結構如圖1所示: ![](http://my.csdn.net/uploads/201205/13/1336909329_9009.jpg) 圖1 初始設計方案結構圖 在編碼實現圖1所示結構時,Sunny軟件公司開發人員發現該設計方案存在一個非常嚴重的問題,由于每次轉換數據時數據來源不一定相同,因此需要更換數據轉換類,如有時候需要將TXTDataConvertor改為ExcelDataConvertor,此時,需要修改CustomerDAO的源代碼,而且在引入并使用新的數據轉換類時也不得不修改CustomerDAO的源代碼,系統擴展性較差,違反了開閉原則,現需要對該方案進行重構。 在本實例中,由于CustomerDAO針對具體數據轉換類編程,因此在增加新的數據轉換類或者更換數據轉換類時都不得不修改CustomerDAO的源代碼。我們可以通過引入抽象數據轉換類解決該問題,在引入抽象數據轉換類DataConvertor之后,CustomerDAO針對抽象類DataConvertor編程,而將具體數據轉換類名存儲在配置文件中,符合依賴倒轉原則。根據里氏代換原則,程序運行時,具體數據轉換類對象將替換DataConvertor類型的對象,程序不會出現任何問題。更換具體數據轉換類時無須修改源代碼,只需要修改配置文件;如果需要增加新的具體數據轉換類,只要將新增數據轉換類作為DataConvertor的子類并修改配置文件即可,原有代碼無須做任何修改,滿足開閉原則。重構后的結構如圖2所示: ![](http://my.csdn.net/uploads/201205/13/1336909334_4352.jpg) 圖2重構后的結構圖 在上述重構過程中,我們使用了開閉原則、里氏代換原則和依賴倒轉原則,在大多數情況下,這三個設計原則會同時出現,開閉原則是目標,里氏代換原則是基礎,依賴倒轉原則是手段,它們相輔相成,相互補充,目標一致,只是分析問題時所站角度不同而已。 擴展 Robert C. Martin(Bob大叔):Object Mentor公司總裁,面向對象設計、模式、UML、敏捷方法學和極限編程領域內的資深顧問。 ![](http://my.csdn.net/uploads/201205/13/1336909339_7753.jpg) 再上兩張Bob大叔的“玉照”,大笑: ![](http://my.csdn.net/uploads/201205/13/1336911356_6234.jpg) ![](http://my.csdn.net/uploads/201205/13/1336911362_1916.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看