這篇文章主要介紹了淺談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的開放封閉原則有兩個特徵。
- 對於擴充功能是開放的
- 對於變更是封閉的
基於上述說的設計原則, 如何最佳化分上述提到的問題
想法是將多個分享管道組成鍊式呼叫。將分享動作抽象化出來,分發到各個管道去實現。
定義分享頻道鏈
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中文網其他相關文章!