一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 淺談Java設(shè)計(jì)模式之開放封閉原則

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

2020-09-04 14:11堅(jiān)守一輩子的幸福 Java教程

本篇文章主要介紹了淺談Java設(shè)計(jì)模式之開放封閉原則,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

寫在前面

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

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

ShareChannelManager.java

?
1
2
3
4
5
6
7
8
9
10
11
12
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)閉原則是說(shuō)系統(tǒng)的架構(gòu)主鏈路不能隨著業(yè)務(wù)迭代而大改, 即便是動(dòng)輒全身,也只能說(shuō)明系統(tǒng)的架構(gòu)有問(wèn)題。每個(gè)系統(tǒng)都必須經(jīng)歷一個(gè)從0到1的過(guò)程, 隨著業(yè)務(wù)的發(fā)展,系統(tǒng)也可能一成不變。如何讓系統(tǒng)的架構(gòu)前瞻性、及拓展性,都是我們?cè)谌粘i_發(fā)中必須思考的技術(shù)點(diǎn)。
總之,Java的開放封閉原則有兩個(gè)特征。

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

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

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

定義分享渠道鏈

?
1
2
3
4
5
6
7
8
9
10
11
12
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);
         }
  }

定義分享渠道父類

?
1
2
3
public interface ShareChannel {
  public ResultDO<String> share(int shareCod);
}

A渠道分享

?
1
2
3
4
5
6
7
public class AChannel implements ShareChannel {
 
  @Override
  public ResultDO<String> share(int shareCode) {
       // TODO 分享A渠道邏輯
    }
}

B渠道分享

?
1
2
3
4
5
6
7
public class BChannel implements ShareChannel {
 
  @Override
  public ResultDO<String> share(int shareCode) {
       // TODO 分享B渠道邏輯
    }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
<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

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

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

假設(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í)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/chenmo-xpw/p/6649246.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费精品国产在线观看 | 我的家教老师 | 青草社区视频 | 大胆私拍模特国模377 | 欧美日韩国产精品va | 羞羞视频污 | 11 13加污女qq看他下面 | 69欧美性猛交 | 亚洲天堂三区 | 青青青在线观看国产精品 | 超91在线| 亚洲26uuuu最新地址 | 99视频久久 | 99热er| 亚洲日本在线观看网址 | 免费一级欧美片片线观看 | 欧美国产日韩在线播放 | 果冻传媒在线观看的 | 久久精品国产久精国产果冻传媒 | 全彩成人18h漫画 | 国产果冻传媒 | 国产精品激情综合久久 | 日本最大的黄色网站 | 男人天堂官方网站 | 日本一二线不卡在线观看 | 日本黄大片影院一区二区 | 天天天做天天天天爱天天想 | 北海市副市长黄江老公 | 爱爱调教| 亚欧成人中文字幕一区 | 青青青青青国产免费手机看视频 | 欧美一级特黄刺激大片视频 | 出a级黑粗大硬长爽猛视频 吃胸膜奶视频456 | 免费一级夫妻a | 精品午夜久久福利大片免费 | 丝瓜污污视频 | chaopeng在线视频进入 | jiuse在线| 免费观看视频网站 | 成人不卡在线 | 午夜精品久久久久久久99蜜桃 |