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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 面向對象設計原則之開閉原則 開閉原則是面向對象的可復用設計的第一塊基石,它是最重要的面向對象設計原則。開閉原則由Bertrand Meyer于1988年提出,其定義如下: 開閉原則(Open-Closed Principle, OCP):一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展。 在開閉原則的定義中,軟件實體可以指一個軟件模塊、一個由多個類組成的局部結構或一個獨立的類。 任何軟件都需要面臨一個很重要的問題,即它們的需求會隨時間的推移而發生變化。當軟件系統需要面對新的需求時,我們應該盡量保證系統的設計框架是穩定的。如果一個軟件設計符合開閉原則,那么可以非常方便地對系統進行擴展,而且在擴展時無須修改現有代碼,使得軟件系統在擁有適應性和靈活性的同時具備較好的穩定性和延續性。隨著軟件規模越來越大,軟件壽命越來越長,軟件維護成本越來越高,設計滿足開閉原則的軟件系統也變得越來越重要。 為了滿足開閉原則,需要對系統進行抽象化設計,抽象化是開閉原則的關鍵。在Java、C#等編程語言中,可以為系統定義一個相對穩定的抽象層,而將不同的實現行為移至具體的實現層中完成。在很多面向對象編程語言中都提供了接口、抽象類等機制,可以通過它們定義系統的抽象層,再通過具體類來進行擴展。如果需要修改系統的行為,無須對抽象層進行任何改動,只需要增加新的具體類來實現新的業務功能即可,實現在不修改已有代碼的基礎上擴展系統的功能,達到開閉原則的要求。 Sunny軟件公司開發的CRM系統可以顯示各種類型的圖表,如餅狀圖和柱狀圖等,為了支持多種圖表顯示方式,原始設計方案如圖1所示: ![](http://my.csdn.net/uploads/201205/05/1336201566_1496.jpg) 圖1 初始設計方案結構圖 在ChartDisplay類的display()方法中存在如下代碼片段: ``` ...... if (type.equals("pie")) { PieChart chart = new PieChart(); chart.display(); } else if (type.equals("bar")) { BarChart chart = new BarChart(); chart.display(); } ...... ``` 在該代碼中,如果需要增加一個新的圖表類,如折線圖LineChart,則需要修改ChartDisplay類的display()方法的源代碼,增加新的判斷邏輯,違反了開閉原則。 現對該系統進行重構,使之符合開閉原則。 在本實例中,由于在ChartDisplay類的display()方法中針對每一個圖表類編程,因此增加新的圖表類不得不修改源代碼。可以通過抽象化的方式對系統進行重構,使之增加新的圖表類時無須修改源代碼,滿足開閉原則。 具體做法如下: (1) 增加一個抽象圖表類AbstractChart,將各種具體圖表類作為其子類; (2) ChartDisplay類針對抽象圖表類進行編程,由客戶端來決定使用哪種具體圖表。 重構后結構如圖2所示: ![](http://my.csdn.net/uploads/201205/05/1336201573_6059.jpg) 圖2 重構后的結構圖 在圖2中,我們引入了抽象圖表類AbstractChart,且ChartDisplay針對抽象圖表類進行編程,并通過setChart()方法由客戶端來設置實例化的具體圖表對象,在ChartDisplay的display()方法中調用chart對象的display()方法顯示圖表。如果需要增加一種新的圖表,如折線圖LineChart,只需要將LineChart也作為AbstractChart的子類,在客戶端向ChartDisplay中注入一個LineChart對象即可,無須修改現有類庫的源代碼。 注意:因為xml和properties等格式的配置文件是純文本文件,可以直接通過VI編輯器或記事本進行編輯,且無須編譯,因此在軟件開發中,一般不把對配置文件的修改認為是對系統源代碼的修改。如果一個系統在擴展時只涉及到修改配置文件,而原有的Java代碼或C#代碼沒有做任何修改,該系統即可認為是一個符合開閉原則的系統。 ![](http://my.csdn.net/uploads/201205/06/1336311690_6579.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>

                              哎呀哎呀视频在线观看