<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                **開閉原則** 開閉原則是指一個軟件實體,如類、模塊和函數應該對擴展開放,對修改關閉,也就是說一個軟件實體應該通過擴展來實現變化,而不是通過修改已有的代碼來實現變化。 開閉原則是面向對象的可復用設計的基石。其他設計原則是實現開閉原則的手段和工具。 開閉原則的意思就是說,你設計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。 這個原則有兩個特性: * 一個是說對于擴展是開放的 * 一個是說對于更改是封閉的 面對需求,對程序的改動是通過增加新代碼進行的,而不是更改現有的代碼。這就是“開放-封閉原則”的精神所在。 簡單的用一句經典的話來說:過去的事已成歷史,是不可修改的,因為時光不可倒流,但現在或明天計劃做什么,是可以自己決定(即擴展)的。 ----------------------- **開閉原則好處** **如果一個軟件系統符合開閉原則的,那么從軟件工程的角度來看,它至少具有這樣的好處:** **對軟件測試友好** 軟件遵守開閉原則的話,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼仍然能夠正常運行。 **可復用性好** 我們可以在軟件完成以后,仍然可以對軟件進行擴展,加入新的功能,非常靈活。因此,這個軟件系統就可以通過不斷地增加新的組件,來滿足不斷變化的需求。 **可維護性好** 由于對于已有的軟件系統的組件,特別是它的抽象底層不去修改,因此,我們不用擔心軟件系統中原有組件的穩定性,這就使變化中的軟件系統有一定的穩定性和延續性。 ------------------------ **開閉原則示例:** 以課程為例說明什么是開閉原則,首先定義課程接口以及英語課程接口實現: ``` /** * 定義課程接口 */ public interface ICourse { String getName(); // 獲取課程名稱 Double getPrice(); // 獲取課程價格 Integer getType(); // 獲取課程類型 } /** * 英語課程接口實現 */ public class EnglishCourse implements ICourse { private String name; private Double price; private Integer type; public EnglishCourse(String name, Double price, Integer type) { this.name = name; this.price = price; this.type = type; } @Override public String getName() { return null; } @Override public Double getPrice() { return null; } @Override public Integer getType() { return null; } } // 測試 public class Main { public static void main(String[] args) { ICourse course = new EnglishCourse("小學英語", 199D, "Mr.Zhang"); System.out.println( "課程名字:"+course.getName() + " " + "課程價格:"+course.getPrice() + " " + "課程作者:"+course.getAuthor() ); } } ``` 項目上線,課程正常銷售,但是我們產品需要做些活動來促進銷售,比如:打折。那么問題來了:打折這一動作就是一個變化,而我們要做的就是擁抱變化,現在開始考慮如何解決這個問題,可以考慮下面三種方案: **修改接口** ``` public interface ICourse { // 獲取課程名稱 String getName(); // 獲取課程價格 Double getPrice(); // 獲取課程類型 String getAuthor(); // 新增:打折接口 Double getSalePrice(); } ``` 在之前的課程接口中添加一個方法 getSalePrice() 專門用來獲取打折后的價格; 如果這樣修改就會產生兩個問題,所以此方案否定 * ICourse 接口不應該被經常修改,否則接口作為契約的作用就失去了 * 并不是所有的課程都需要打折,加入還有語文課,數學課等都實現了這一接口,但是只有英語課打折,與實際業務不符 **修改實現類** 在接口實現里直接修改 getPrice()方法,此方法會導致獲取原價出問題;或添加獲取打折的接口 getSalePrice(),這樣就會導致獲取價格的方法存在兩個,所以這個方案也否定。 **通過擴展實現變化** 直接添加一個子類 SaleEnglishCourse ,重寫 getPrice()方法,這個方案對源代碼沒有影響,符合開閉原則,所以是可執行的方案,代碼如下,代碼如下: ``` public class SaleEnglishCourse extends EnglishCourse { public SaleEnglishCourse(String name, Double price, String author) { super(name, price, author); } @Override public Double getPrice() { return super.getPrice() * 0.85; } } ``` 綜上所述,如果采用第三種,即開閉原則,以后再來個語文課程,數學課程等等的價格變動都可以采用此方案,維護性極高而且也很靈活。
                  <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>

                              哎呀哎呀视频在线观看