<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #依賴倒置原則(Dependence Inversion Principle) ##應用場景 電腦在以前維修的話是根本不可能的事,可是現在卻特別容易,比如說內存壞了,買個內存條,硬盤壞了,買個硬盤換上。為啥這么方便?從修電腦里面就有面相對象的幾大設計原則,比如單一職責原則,內存壞了,不應該成為更換CPU的理由,它們各自的職責是明確的。再比如開放-封閉原則,內存不夠只要插槽足夠就可以添加。還有依賴倒轉原則,**原話解釋是抽象不應該依賴細節,細節應該依賴于抽象,說白了,就是要針對接口編程,不要對實現編程**,無論主板,CPU,內存,硬盤都是針對接口設計的,如果是針對實現來設計,內存就要對應的某個品牌的主板,那就會出現換內存需要把主板也換了的尷尬。 為什么叫反轉呢? 面對過程開發時,為了使得常用代碼可以復用,一般都會把這些常用代碼寫成許許多多函數的程序庫,這樣我們做新項目時,去調用這些底層的函數就可以了。比如我們做的項目大多要訪問數據庫,所以我們就把訪問數據庫的代碼寫成了函數,每次做新項目時就去調用,這就叫做高層模塊依賴底層模塊。 但是要做新項目是 業務邏輯的高層模塊都是一樣的,客戶卻希望使用不同的數據庫或存儲信息方式,這時出現麻煩了。我們希望能再次利用這些高層模塊,但高層模塊都是與底層的訪問數據庫綁定在一起的,沒辦法復用這些高層模塊,這就非常糟糕了。就像剛才說的,PC里如果CPU,內存,硬盤都是需要依賴具體的主板,主板一壞,所有的部件都沒法用了,顯然不合理,而如果不管高層模塊還是底層模塊,它們都依賴于抽象,具體一點就是接口或者抽象類,只要接口是穩定的,那么任何一個的更改都不用擔心其它受影響,這就使得無論高層模塊還是底層模塊都可以很容易被復用,這才是最好的辦法。 ##實例 依賴倒置原則基于這樣一個事實:相對于細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建起來的架構比以細節為基礎搭建起來的架構要穩定的多。在java中,抽象指的是接口或者抽象類,細節就是具體的實現類,使用接口或者抽象類的目的是制定好規范和契約,而不去涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。 依賴倒置原則的核心思想是面向接口編程,我們依舊用一個例子來說明面向接口編程比相對于面向實現編程好在什么地方。場景是這樣的,母親給孩子講故事,只要給她一本書,她就可以照著書給孩子講故事了。代碼如下: ``` class Book{ public String getContent(){ return "很久很久以前有一個阿拉伯的故事……"; } } class Mother{ public void narrate(Book book){ System.out.println("媽媽開始講故事"); System.out.println(book.getContent()); } } public class Client{ public static void main(String[] args){ Mother mother = new Mother(); mother.narrate(new Book()); } } ``` 運行良好,假如有一天,需求變成這樣:不是給書而是給一份報紙,讓這位母親講一下報紙上的故事,報紙的代碼如下: ``` class Newspaper{ public String getContent(){ return "林書豪38+7領導尼克斯擊敗湖人……"; } } ``` 這位母親卻辦不到,因為她居然不會讀報紙上的故事,這太荒唐了,只是將書換成報紙,居然必須要修改Mother才能讀。假如以后需求換成雜志呢?換成網頁呢?還要不斷地修改Mother,這顯然不是好的設計。原因就是Mother與Book之間的耦合性太高了,必須降低他們之間的耦合度才行。 我們引入一個抽象的接口IReader。讀物,只要是帶字的都屬于讀物: ``` interface IReader{ public String getContent(); } ``` Mother類與接口IReader發生依賴關系,而Book和Newspaper都屬于讀物的范疇,他們各自都去實現IReader接口,這樣就符合依賴倒置原則了,代碼修改為: ``` class Newspaper implements IReader { public String getContent(){ return "林書豪17+9助尼克斯擊敗老鷹……"; } } class Book implements IReader{ public String getContent(){ return "很久很久以前有一個阿拉伯的故事……"; } } class Mother{ public void narrate(IReader reader){ System.out.println("媽媽開始講故事"); System.out.println(reader.getContent()); } } public class Client{ public static void main(String[] args){ Mother mother = new Mother(); mother.narrate(new Book()); mother.narrate(new Newspaper()); } } ``` 這樣修改后,無論以后怎樣擴展Client類,都不需要再修改Mother類了。這只是一個簡單的例子,實際情況中,代表高層模塊的Mother類將負責完成主要的業務邏輯,一旦需要對它進行修改,引入錯誤的風險極大。所以遵循依賴倒置原則可以降低類之間的耦合性,提高系統的穩定性,降低修改程序造成的風險。 采用依賴倒置原則給多人并行開發帶來了極大的便利,比如上例中,原本Mother類與Book類直接耦合時,Mother類必須等Book類編碼完成后才可以進行編碼,因為Mother類依賴于Book類。修改后的程序則可以同時開工,互不影響,因為Mother與Book類一點關系也沒有。參與協作開發的人越多、項目越龐大,采用依賴導致原則的意義就越重大。現在很流行的TDD開發模式就是依賴倒置原則最成功的應用。 傳遞依賴關系有三種方式,以上的例子中使用的方法是接口傳遞,另外還有兩種傳遞方式:構造方法傳遞和setter方法傳遞,相信用過Spring框架的,對依賴的傳遞方式一定不會陌生。 在實際編程中,我們一般需要做到如下3點: * 低層模塊盡量都要有抽象類或接口,或者兩者都有。 * 變量的聲明類型盡量是抽象類或接口。 * 使用繼承時遵循里氏替換原則。 依賴倒置原則的核心就是要我們面向接口編程,理解了面向接口編程,也就理解了依賴倒置。
                  <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>

                              哎呀哎呀视频在线观看