首頁  >  文章  >  Java  >  簡單介紹Java設計模式之開放封閉原則的範例程式碼

簡單介紹Java設計模式之開放封閉原則的範例程式碼

黄舟
黄舟原創
2017-03-31 10:35:101984瀏覽

這篇文章主要介紹了淺談Java設計模式之開放封閉原則,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

寫在前面

最近, 接手了一個新業務,系統的架構可圈可點。但有些地方讓人望而生畏,有些程式碼臃腫難以維護,讓人不敢恭維。於是,結合了Java的開放封閉原則,對其中一部分程式碼進行了重構優化。

先來看下先前系統的舊程式碼

ShareChannelManager.java

public ResultDO<String> shareChannel(int shareCode) {

  if(ShareCodeUtil.share2A(shareCode)) {
     // TODO, 分享到A渠道的业务逻辑代码
  }

  if(ShareCodeUtil.share2B(shareCode)) {
     // TODO, 分享到B渠道的业务逻辑代码
  }

  ...渠道n...
}

shareChannel這個方法承載了分享管道的主要連結邏輯。分享到各個管道的程式碼都寫在了一個類別的方法裡面, 顯得很臃腫, 不好維護。每次新增分享的管道,都得修改此重量級的方法。稍微手抖擼錯了, 會影響到其它頻道分享。同時也違背了Java的開放封閉原則。

介紹下Java的開放封閉原則

Java開放封閉原則, 咋一看給人一種矛盾的feel。開放了怎麼還封閉?不要從表面上去理解。從兩個維度去思考, **開放** & ***封閉**。 Java的開放原則是指設計的架構具備良好的拓展性;而關閉原則是說系統的架構主鏈路不能隨著業務迭代而大改, 即便是動輒全身,也只能說明系統的架構有問題。每個系統都必須經歷一個從0到1的過程, 隨著業務的發展,系統也可能一成不變。如何讓系統的架構前瞻性、及拓展性,都是我們在日常開發中必須思考的技術點。
總之,Java的開放封閉原則有兩個特徵。

  1. - 對於擴充功能是開放的

  2. - 對於變更是封閉的

基於上述說的設計原則, 如何最佳化分上述提到的問題

想法是將多個分享管道組成鍊式呼叫。將分享動作抽象化出來,分發到各個管道去實現。

定義分享頻道鏈

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 組裝成一條呼叫鏈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);
}

最後來回顧下,看看優化後架構帶來的好處

假設有新的管道分享業務需求,CChannel, 想想我們要改變的點。這次不必改動ShareChannelManager核心類別邏輯了。只需要拓展一個CChannel,實作ShareChannel介面share方法,再設定到xml即可。這種改動點風險是可以控制的,不動到核心類別邏輯。

以上是簡單介紹Java設計模式之開放封閉原則的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn