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

實(shí)例講解Java設(shè)計(jì)模式編程中的OCP開閉原則

 更新時(shí)間:2016年02月03日 11:47:27   作者:LoveLion  
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的開閉原則,開閉原則的大意被作者總結(jié)為用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié),需要的朋友可以參考下

定義:一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。
問題由來:在軟件的生命周期內(nèi),因?yàn)樽兓⑸壓途S護(hù)等原因需要對軟件原有代碼進(jìn)行修改時(shí),可能會(huì)給舊代碼中引入錯(cuò)誤,也可能會(huì)使我們不得不對整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過重新測試。
解決方案:當(dāng)軟件需要變化時(shí),盡量通過擴(kuò)展軟件實(shí)體的行為來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化。
         開閉原則是面向?qū)ο笤O(shè)計(jì)中最基礎(chǔ)的設(shè)計(jì)原則,它指導(dǎo)我們?nèi)绾谓⒎€(wěn)定靈活的系統(tǒng)。開閉原則可能是設(shè)計(jì)模式六項(xiàng)原則中定義最模糊的一個(gè)了,它只告訴我們對擴(kuò)展開放,對修改關(guān)閉,可是到底如何才能做到對擴(kuò)展開放,對修改關(guān)閉,并沒有明確的告訴我們。以前,如果有人告訴我“你進(jìn)行設(shè)計(jì)的時(shí)候一定要遵守開閉原則”,我會(huì)覺的他什么都沒說,但貌似又什么都說了。因?yàn)殚_閉原則真的太虛了。
         在仔細(xì)思考以及仔細(xì)閱讀很多設(shè)計(jì)模式的文章后,終于對開閉原則有了一點(diǎn)認(rèn)識(shí)。其實(shí),我們遵循設(shè)計(jì)模式前面5大原則,以及使用23種設(shè)計(jì)模式的目的就是遵循開閉原則。也就是說,只要我們對前面5項(xiàng)原則遵守的好了,設(shè)計(jì)出的軟件自然是符合開閉原則的,這個(gè)開閉原則更像是前面五項(xiàng)原則遵守程度的“平均得分”,前面5項(xiàng)原則遵守的好,平均分自然就高,說明軟件設(shè)計(jì)開閉原則遵守的好;如果前面5項(xiàng)原則遵守的不好,則說明開閉原則遵守的不好。
         其實(shí)筆者認(rèn)為,開閉原則無非就是想表達(dá)這樣一層意思:用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。因?yàn)槌橄箪`活性好,適應(yīng)性廣,只要抽象的合理,可以基本保持軟件架構(gòu)的穩(wěn)定。而軟件中易變的細(xì)節(jié),我們用從抽象派生的實(shí)現(xiàn)類來進(jìn)行擴(kuò)展,當(dāng)軟件需要發(fā)生變化時(shí),我們只需要根據(jù)需求重新派生一個(gè)實(shí)現(xiàn)類來擴(kuò)展就可以了。當(dāng)然前提是我們的抽象要合理,要對需求的變更有前瞻性和預(yù)見性才行。
    

  在開閉原則的定義中,軟件實(shí)體可以指一個(gè)軟件模塊、一個(gè)由多個(gè)類組成的局部結(jié)構(gòu)或一個(gè)獨(dú)立的類。
      任何軟件都需要面臨一個(gè)很重要的問題,即它們的需求會(huì)隨時(shí)間的推移而發(fā)生變化。當(dāng)軟件系統(tǒng)需要面對新的需求時(shí),我們應(yīng)該盡量保證系統(tǒng)的設(shè)計(jì)框架是穩(wěn)定的。如果一個(gè)軟件設(shè)計(jì)符合開閉原則,那么可以非常方便地對系統(tǒng)進(jìn)行擴(kuò)展,而且在擴(kuò)展時(shí)無須修改現(xiàn)有代碼,使得軟件系統(tǒng)在擁有適應(yīng)性和靈活性的同時(shí)具備較好的穩(wěn)定性和延續(xù)性。隨著軟件規(guī)模越來越大,軟件壽命越來越長,軟件維護(hù)成本越來越高,設(shè)計(jì)滿足開閉原則的軟件系統(tǒng)也變得越來越重要。
      為了滿足開閉原則,需要對系統(tǒng)進(jìn)行抽象化設(shè)計(jì),抽象化是開閉原則的關(guān)鍵。在Java、C#等編程語言中,可以為系統(tǒng)定義一個(gè)相對穩(wěn)定的抽象層,而將不同的實(shí)現(xiàn)行為移至具體的實(shí)現(xiàn)層中完成。在很多面向?qū)ο缶幊陶Z言中都提供了接口、抽象類等機(jī)制,可以通過它們定義系統(tǒng)的抽象層,再通過具體類來進(jìn)行擴(kuò)展。如果需要修改系統(tǒng)的行為,無須對抽象層進(jìn)行任何改動(dòng),只需要增加新的具體類來實(shí)現(xiàn)新的業(yè)務(wù)功能即可,實(shí)現(xiàn)在不修改已有代碼的基礎(chǔ)上擴(kuò)展系統(tǒng)的功能,達(dá)到開閉原則的要求。
      Sunny軟件公司開發(fā)的CRM系統(tǒng)可以顯示各種類型的圖表,如餅狀圖和柱狀圖等,為了支持多種圖表顯示方式,原始設(shè)計(jì)方案如下圖所示:

201623114347802.jpg (578×257)

在ChartDisplay類的display()方法中存在如下代碼片段:

...... 
if (type.equals("pie")) { 
 PieChart chart = new PieChart(); 
 chart.display(); 
} 
else if (type.equals("bar")) { 
 BarChart chart = new BarChart(); 
 chart.display(); 
} 
...... 

      在該代碼中,如果需要增加一個(gè)新的圖表類,如折線圖LineChart,則需要修改ChartDisplay類的display()方法的源代碼,增加新的判斷邏輯,違反了開閉原則。
      現(xiàn)對該系統(tǒng)進(jìn)行重構(gòu),使之符合開閉原則。
       在本實(shí)例中,由于在ChartDisplay類的display()方法中針對每一個(gè)圖表類編程,因此增加新的圖表類不得不修改源代碼??梢酝ㄟ^抽象化的方式對系統(tǒng)進(jìn)行重構(gòu),使之增加新的圖表類時(shí)無須修改源代碼,滿足開閉原則。具體做法如下:
      (1) 增加一個(gè)抽象圖表類AbstractChart,將各種具體圖表類作為其子類;
      (2)  ChartDisplay類針對抽象圖表類進(jìn)行編程,由客戶端來決定使用哪種具體圖表。
      重構(gòu)后結(jié)構(gòu)如下圖所示:

201623114417411.jpg (778×317)

  在圖2中,我們引入了抽象圖表類AbstractChart,且ChartDisplay針對抽象圖表類進(jìn)行編程,并通過setChart()方法由客戶端來設(shè)置實(shí)例化的具體圖表對象,在ChartDisplay的display()方法中調(diào)用chart對象的display()方法顯示圖表。如果需要增加一種新的圖表,如折線圖LineChart,只需要將LineChart也作為AbstractChart的子類,在客戶端向ChartDisplay中注入一個(gè)LineChart對象即可,無須修改現(xiàn)有類庫的源代碼。    
       注意:因?yàn)閤ml和properties等格式的配置文件是純文本文件,可以直接通過VI編輯器或記事本進(jìn)行編輯,且無須編譯,因此在軟件開發(fā)中,一般不把對配置文件的修改認(rèn)為是對系統(tǒng)源代碼的修改。如果一個(gè)系統(tǒng)在擴(kuò)展時(shí)只涉及到修改配置文件,而原有的Java代碼或C#代碼沒有做任何修改,該系統(tǒng)即可認(rèn)為是一個(gè)符合開閉原則的系統(tǒng)。

相關(guān)文章

  • 詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    這篇文章主要介紹了詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java連接mysql數(shù)據(jù)庫代碼實(shí)例程序

    Java連接mysql數(shù)據(jù)庫代碼實(shí)例程序

    這篇文章主要介紹了java連接mysql數(shù)據(jù)庫代碼實(shí)例程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    這篇文章深入介紹了JVM虛擬機(jī)的鎖優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • SpringBoot整合Aop全過程

    SpringBoot整合Aop全過程

    AOP(面向切面編程)技術(shù)可以高效地解決日志記錄、事務(wù)管理、權(quán)限控制等問題,日志記錄通過自定義注解和切面類,自動(dòng)記錄方法調(diào)用詳情,減少重復(fù)代碼,事務(wù)管理方面,通過AOP可以在不改變業(yè)務(wù)代碼的情況下,實(shí)現(xiàn)事務(wù)的自動(dòng)開啟、提交和回滾,保證數(shù)據(jù)一致性
    2024-10-10
  • IDEA一鍵生成方法的序列圖神操作

    IDEA一鍵生成方法的序列圖神操作

    為了能夠更快更清晰地搞清對象之間的調(diào)用關(guān)系,我經(jīng)常需要用到序列圖。手動(dòng)畫序列圖還是很麻煩費(fèi)時(shí)的,不過?IDEA?提供了一個(gè)叫做SequenceDiagram?的插件幫助我們解決這個(gè)問題。通SequenceDiagram?這個(gè)插件,我們一鍵可以生成時(shí)序圖
    2022-01-01
  • SpringBoot整合Liquibase的示例代碼

    SpringBoot整合Liquibase的示例代碼

    本篇文章給大家介紹SpringBoot整合Liquibase的兩種情況分析,看似整合問題很簡單,但是很容易出錯(cuò),下面小編給大家介紹下整合步驟,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • idea推送項(xiàng)目到gitee中的創(chuàng)建方法

    idea推送項(xiàng)目到gitee中的創(chuàng)建方法

    這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • java如何反編譯jar包并修改class文件重新打包

    java如何反編譯jar包并修改class文件重新打包

    這篇文章主要介紹了java如何反編譯jar包并修改class文件重新打包,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot+vue制作后臺(tái)管理系統(tǒng)項(xiàng)目

    springboot+vue制作后臺(tái)管理系統(tǒng)項(xiàng)目

    本文詳細(xì)介紹了后臺(tái)管理使用springboot+vue制作,以分步驟、圖文的形式詳細(xì)講解,大家有需要的可以參考參考
    2021-08-08
  • gataway斷言工作流程源碼剖析

    gataway斷言工作流程源碼剖析

    這篇文章主要為大家介紹了gataway斷言工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評論

鹤峰县| 襄城县| 当阳市| 文安县| 揭西县| 长治县| 自贡市| 南和县| 繁峙县| 金溪县| 通化县| 平阳县| 疏附县| 龙山县| 皮山县| 湖北省| 玉环县| 芜湖县| 高邑县| 武清区| 石渠县| 锡林郭勒盟| 中宁县| 寿宁县| 含山县| 扎兰屯市| 兴安县| 阿拉善右旗| 临武县| 吉安市| 铁力市| 伊金霍洛旗| 调兵山市| 恩施市| 满洲里市| 石狮市| 舒兰市| 台东市| 五寨县| 沽源县| 南宁市|