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

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

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

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

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

201623114347802.jpg (578×257)

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

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

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

201623114417411.jpg (778×317)

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

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

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

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

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

    SpringBoot整合Aop全過(guò)程

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

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

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

    SpringBoot整合Liquibase的示例代碼

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

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

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

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

    這篇文章主要介紹了java如何反編譯jar包并修改class文件重新打包,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(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

最新評(píng)論

洪雅县| 沙坪坝区| 龙江县| 乌拉特后旗| 集安市| 望城县| 龙海市| 公安县| 巴东县| 阿合奇县| 莲花县| 古田县| 和林格尔县| 高安市| 保靖县| 仙居县| 揭西县| 陕西省| 凤山县| 汕尾市| 油尖旺区| 敦煌市| 镇江市| 高陵县| 平和县| 象山县| 洪泽县| 黔江区| 常德市| 城步| 衡南县| 甘谷县| 繁峙县| 米林县| 盐亭县| 信阳市| 大城县| 开江县| 桓仁| 宁明县| 隆尧县|