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

淺談Java設(shè)計(jì)模式之開放封閉原則

 更新時(shí)間:2017年03月31日 08:16:33   作者:堅(jiān)守一輩子的幸福  
本篇文章主要介紹了淺談Java設(shè)計(jì)模式之開放封閉原則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

寫在前面

最近, 接手了一個(gè)新業(yè)務(wù),系統(tǒng)的架構(gòu)可圈可點(diǎn)。但有些地方讓人望而生畏,有些代碼臃腫難以維護(hù),讓人不敢恭維。于是,結(jié)合了Java的開放封閉原則,對(duì)其中一部分代碼進(jìn)行了重構(gòu)優(yōu)化。

先來看下以前系統(tǒng)的老代碼

ShareChannelManager.java

public ResultDO<String> shareChannel(int shareCode) {

  if(ShareCodeUtil.share2A(shareCode)) {
     // TODO, 分享到A渠道的業(yè)務(wù)邏輯代碼
  }

  if(ShareCodeUtil.share2B(shareCode)) {
     // TODO, 分享到B渠道的業(yè)務(wù)邏輯代碼
  }

  ...渠道n...
}

shareChannel這個(gè)方法承載了分享渠道的主要鏈路邏輯。分享到各個(gè)渠道的代碼都寫在了一個(gè)類的方法里面, 顯得很臃腫, 不好維護(hù)。每次添加分享的渠道,都得修改此重量級(jí)的方法。稍微手抖擼錯(cuò)了, 會(huì)影響到其它渠道分享。同時(shí)也違背了Java的開放封閉原則。

介紹下Java的開放封閉原則

Java開放封閉原則, 咋一看給人一種矛盾的feel。開放了怎么還封閉呢?不要從表面上去理解。從兩個(gè)維度去思考, **開放** & ***封閉**。Java的開放原則是指設(shè)計(jì)的架構(gòu)具備良好的拓展性;而關(guān)閉原則是說系統(tǒng)的架構(gòu)主鏈路不能隨著業(yè)務(wù)迭代而大改, 即便是動(dòng)輒全身,也只能說明系統(tǒng)的架構(gòu)有問題。每個(gè)系統(tǒng)都必須經(jīng)歷一個(gè)從0到1的過程, 隨著業(yè)務(wù)的發(fā)展,系統(tǒng)也可能一成不變。如何讓系統(tǒng)的架構(gòu)前瞻性、及拓展性,都是我們?cè)谌粘i_發(fā)中必須思考的技術(shù)點(diǎn)。
總之,Java的開放封閉原則有兩個(gè)特征。

  1. - 對(duì)于擴(kuò)展是開放的
  2. - 對(duì)于更改是封閉的

基于上述說的設(shè)計(jì)原則, 如何優(yōu)化分上述提到的問題

思路是將多個(gè)分享渠道組成鏈?zhǔn)秸{(diào)用。將分享動(dòng)作抽象出來,分發(fā)到各個(gè)渠道去實(shí)現(xiàn)。

定義分享渠道鏈

public class ShareChannelChain {  
  private final Logger LOG = LoggerFactory.getLogger(this.getClass());

  /**
   * 分享渠道鏈
   */
  private List<ShareChannel> shareChannels;
  public ResultDO<String> share(int shareCode) {
    for (ShareChannel s : shareChannels) {
      ResultDO<String> r = s.share(shareCode);
         }
  }

定義分享渠道父類

public interface ShareChannel {
  public ResultDO<String> share(int shareCod);
}

A渠道分享

public class AChannel implements ShareChannel {

  @Override
  public ResultDO<String> share(int shareCode) {
       // TODO 分享A渠道邏輯
    }
}

B渠道分享

public class BChannel implements ShareChannel {

  @Override
  public ResultDO<String> share(int shareCode) {
       // TODO 分享B渠道邏輯
    }
}

將AChannel 和 BChannel 組裝成一條調(diào)用鏈 ShareChannelChain。

  <bean id="AChannel" class="com.test.AChannel">
  </bean>
  <bean id="BChannel" class="com.test.BChannel">
  </bean>
  <bean id="shareChannelChain" class="com.test.ShareChannelChain">
    <property name="shareChannels">
      <list>
        <ref local="AChannel"/>
        <ref local="BChannel"/>
      </list>
    </property>
  </bean>

渠道分享主要接口

ShareChannelManager.java

public ResultDO<String> shareChannel(int shareCode) {
    ShareChannelChain.share(shareCode);
}

最后來回顧下,看看優(yōu)化之后架構(gòu)帶來的好處

假設(shè)有新的渠道分享業(yè)務(wù)需求,CChannel, 想想我們要改動(dòng)的點(diǎn)。這次不必改動(dòng)ShareChannelManager核心類邏輯了。只需要拓展一個(gè)CChannel,實(shí)現(xiàn)ShareChannel接口share方法,再配置到xml即可。這種改動(dòng)點(diǎn)風(fēng)險(xiǎn)是可以控制的,不動(dòng)到核心類邏輯。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java的jps命令使用詳解

    java的jps命令使用詳解

    這篇文章介紹了java的jps命令使用詳解,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • SpringBoot使用OpenCV的超詳細(xì)步驟

    SpringBoot使用OpenCV的超詳細(xì)步驟

    最近有個(gè)項(xiàng)?需要對(duì)圖?圖像進(jìn)?處理,使?到了開源框架OpenCV,所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot使用OpenCV的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • @RequestBody不能映射到對(duì)象的解決

    @RequestBody不能映射到對(duì)象的解決

    這篇文章主要介紹了@RequestBody不能映射到對(duì)象的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JavaWeb之Filter過濾器詳解

    JavaWeb之Filter過濾器詳解

    本篇文章主要介紹了JavaWeb之Filter過濾器詳解,實(shí)例分析了JavaWeb之Filter過濾器的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • 通過pipeline配置sonar自動(dòng)化實(shí)現(xiàn)過程解析

    通過pipeline配置sonar自動(dòng)化實(shí)現(xiàn)過程解析

    這篇文章主要介紹了通過pipeline配置sonar自動(dòng)化實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring?Boot緩存實(shí)戰(zhàn)之Redis?設(shè)置有效時(shí)間和自動(dòng)刷新緩存功能(時(shí)間支持在配置文件中配置)

    Spring?Boot緩存實(shí)戰(zhàn)之Redis?設(shè)置有效時(shí)間和自動(dòng)刷新緩存功能(時(shí)間支持在配置文件中配置)

    這篇文章主要介紹了Spring?Boot緩存實(shí)戰(zhàn)?Redis?設(shè)置有效時(shí)間和自動(dòng)刷新緩存,時(shí)間支持在配置文件中配置,需要的朋友可以參考下
    2023-05-05
  • SpringBoot之跨域過濾器配置允許跨域訪問方式

    SpringBoot之跨域過濾器配置允許跨域訪問方式

    這篇文章主要介紹了SpringBoot之跨域過濾器配置允許跨域訪問方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用Java 8中的Lambda表達(dá)式實(shí)現(xiàn)工廠模式

    使用Java 8中的Lambda表達(dá)式實(shí)現(xiàn)工廠模式

    這篇文章主要給大家介紹了使用Java 8中的Lambda表達(dá)式實(shí)現(xiàn)工廠模式的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Java如何批量執(zhí)行datax腳本

    Java如何批量執(zhí)行datax腳本

    這篇文章主要介紹了Java如何批量執(zhí)行datax腳本問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的方法詳解

    Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起看看吧。
    2017-12-12

最新評(píng)論

靖宇县| 克什克腾旗| 从化市| 阿鲁科尔沁旗| 南昌市| 汉寿县| 万山特区| 西吉县| 和平区| 太仆寺旗| 侯马市| 石柱| 聂拉木县| 宜兰市| 虞城县| 平山县| 探索| 抚顺市| 务川| 册亨县| 醴陵市| 宁乡县| 葫芦岛市| 石河子市| 错那县| 望江县| 寻甸| 莒南县| 万年县| 巴里| 浏阳市| 荆门市| 斗六市| 金溪县| 洛扎县| 武义县| 全州县| 孟州市| 五台县| 蓬莱市| 罗平县|