寫在前面
最近, 接手了一個(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è)特征。
- - 對(duì)于擴(kuò)展是開放的
- - 對(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