Spring Boot中如何干掉if else

需求

這里虛擬一個業(yè)務需求,讓大家容易理解望几。假設有一個訂單系統(tǒng)绩脆,里面的一個功能是根據(jù)訂單的不同類型作出不同的處理。

訂單實體:

service接口:

傳統(tǒng)實現(xiàn)

根據(jù)訂單類型寫一堆的if else:

策略模式實現(xiàn)

利用策略模式橄抹,只需要兩行即可實現(xiàn)業(yè)務邏輯:

可以看到上面的方法中注入了HandlerContext靴迫,這是一個處理器上下文,用來保存不同的業(yè)務處理器楼誓,具體在下文會講解玉锌。我們從中獲取一個抽象的處理器AbstractHandler,調用其方法實現(xiàn)業(yè)務邏輯疟羹。

現(xiàn)在可以了解到主守,我們主要的業(yè)務邏輯是在處理器中實現(xiàn)的禀倔,因此有多少個訂單類型,就對應有多少個處理器参淫。以后需求變化救湖,增加了訂單類型,只需要添加相應的處理器就可以涎才,上述OrderServiceV2Impl完全不需改動鞋既。

我們先看看業(yè)務處理器的寫法:

首先每個處理器都必須添加到spring容器中,因此需要加上@Component注解憔维,其次需要加上一個自定義注解@HandlerType涛救,用于標識該處理器對應哪個訂單類型,最后就是繼承AbstractHandler业扒,實現(xiàn)自己的業(yè)務邏輯检吆。

自定義注解 @HandlerType:

抽象處理器 AbstractHandler:

自定義注解和抽象處理器都很簡單,那么如何將處理器注冊到spring容器中呢程储?

具體思路是:

1蹭沛、掃描指定包中標有@HandlerType的類;

2章鲤、將注解中的類型值作為key摊灭,對應的類作為value,保存在Map中败徊;

3帚呼、以上面的map作為構造函數(shù)參數(shù),初始化HandlerContext皱蹦,將其注冊到spring容器中煤杀;

我們將核心的功能封裝在HandlerProcessor類中,完成上面的功能沪哺。

HandlerProcessor:

ClassScaner:掃描工具類源碼

HandlerProcessor需要實現(xiàn)BeanFactoryPostProcessor沈自,在spring處理bean前,將自定義的bean注冊到容器中辜妓。

核心工作已經(jīng)完成枯途,現(xiàn)在看看HandlerContext如何獲取對應的處理器:

HandlerContext:

BeanTool:獲取bean工具類

#getInstance方法根據(jù)類型獲取對應的class,然后根據(jù)class類型獲取注冊到spring中的bean籍滴。

最后請注意一點酪夷,HandlerProcessor和BeanTool必須能被掃描到,或者通過@Bean的方式顯式的注冊孽惰,才能在項目啟動時發(fā)揮作用捶索。

總結

利用策略模式可以簡化繁雜的if else代碼,方便維護灰瞻,而利用自定義注解和自注冊的方式腥例,可以方便應對需求的變更辅甥。本文只是提供一個大致的思路,還有很多細節(jié)可以靈活變化燎竖,例如使用枚舉類型璃弄、或者靜態(tài)常量,作為訂單的類型构回,相信你能想到更多更好的方法夏块。

歡迎加QQ群:851531810一起提升

群內(nèi)已經(jīng)將知識體系整理好(面試題,電子書纤掸,面試視頻)脐供,歡迎加群免費領取

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市借跪,隨后出現(xiàn)的幾起案子政己,更是在濱河造成了極大的恐慌,老刑警劉巖掏愁,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇由,死亡現(xiàn)場離奇詭異,居然都是意外死亡果港,警方通過查閱死者的電腦和手機沦泌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛掠,“玉大人谢谦,你說我怎么就攤上這事÷荞茫” “怎么了他宛?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欠气。 經(jīng)常有香客問我,道長镜撩,這世上最難降的妖魔是什么预柒? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮袁梗,結果婚禮上宜鸯,老公的妹妹穿的比我還像新娘。我一直安慰自己遮怜,他們只是感情好淋袖,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锯梁,像睡著了一般即碗。 火紅的嫁衣襯著肌膚如雪焰情。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天剥懒,我揣著相機與錄音内舟,去河邊找鬼。 笑死初橘,一個胖子當著我的面吹牛验游,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播保檐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耕蝉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夜只?” 一聲冷哼從身側響起垒在,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盐肃,沒想到半個月后爪膊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡砸王,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年推盛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦铃。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耘成,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驹闰,到底是詐尸還是另有隱情瘪菌,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布嘹朗,位于F島的核電站师妙,受9級特大地震影響,放射性物質發(fā)生泄漏屹培。R本人自食惡果不足惜默穴,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褪秀。 院中可真熱鬧蓄诽,春花似錦、人聲如沸媒吗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锯岖,卻和暖如春介袜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎莉。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工米酬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趋箩。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓赃额,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叫确。 傳聞我的和親對象是個殘疾皇子跳芳,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容