策略模式實現(xiàn)

需求

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

訂單實體:

image

service接口:

image

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

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

image

策略模式實現(xiàn)

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

image

可以看到上面的方法中注入了HandlerContext,這是一個處理器上下文液兽,用來保存不同的業(yè)務(wù)處理器骂删,具體在下文會講解。我們從中獲取一個抽象的處理器AbstractHandler四啰,調(diào)用其方法實現(xiàn)業(yè)務(wù)邏輯宁玫。

現(xiàn)在可以了解到,我們主要的業(yè)務(wù)邏輯是在處理器中實現(xiàn)的柑晒,因此有多少個訂單類型欧瘪,就對應(yīng)有多少個處理器。以后需求變化匙赞,增加了訂單類型佛掖,只需要添加相應(yīng)的處理器就可以妖碉,上述OrderServiceV2Impl完全不需改動。

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

image
image
image

首先每個處理器都必須添加到spring容器中苦囱,因此需要加上@Component注解嗅绸,其次需要加上一個自定義注解@HandlerType,用于標識該處理器對應(yīng)哪個訂單類型撕彤,最后就是繼承AbstractHandler鱼鸠,實現(xiàn)自己的業(yè)務(wù)邏輯。

自定義注解 @HandlerType:

image

抽象處理器 AbstractHandler:

image

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

具體思路是:

1、掃描指定包中標有@HandlerType的類职员;

2麻蹋、將注解中的類型值作為key,對應(yīng)的類作為value焊切,保存在Map中扮授;

3、以上面的map作為構(gòu)造函數(shù)參數(shù)专肪,初始化HandlerContext刹勃,將其注冊到spring容器中;

我們將核心的功能封裝在HandlerProcessor類中嚎尤,完成上面的功能荔仁。

HandlerProcessor:

image

ClassScanner:掃描工具類源碼

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

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

HandlerContext:

image

BeanTool:獲取bean工具類

#getInstance 方法根據(jù)類型獲取對應(yīng)的class关贵,然后根據(jù)class類型獲取注冊到spring中的bean遇骑。

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

總結(jié)

利用策略模式可以簡化繁雜的if else代碼翩肌,方便維護模暗,而利用自定義注解和自注冊的方式,可以方便應(yīng)對需求的變更念祭。本文只是提供一個大致的思路兑宇,還有很多細節(jié)可以靈活變化,例如使用枚舉類型粱坤、或者靜態(tài)常量隶糕,作為訂單的類型瓷产,相信你能想到更多更好的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枚驻,一起剝皮案震驚了整個濱河市濒旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌再登,老刑警劉巖尔邓,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锉矢,居然都是意外死亡梯嗽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門沽损,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灯节,“玉大人,你說我怎么就攤上這事绵估⊙捉” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵国裳,是天一觀的道長形入。 經(jīng)常有香客問我,道長躏救,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任螟蒸,我火速辦了婚禮盒使,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘七嫌。我一直安慰自己少办,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布诵原。 她就那樣靜靜地躺著英妓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绍赛。 梳的紋絲不亂的頭發(fā)上蔓纠,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音吗蚌,去河邊找鬼腿倚。 笑死,一個胖子當著我的面吹牛蚯妇,可吹牛的內(nèi)容都是我干的敷燎。 我是一名探鬼主播暂筝,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼硬贯!你這毒婦竟也來了焕襟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饭豹,失蹤者是張志新(化名)和其女友劉穎鸵赖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨状,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卫漫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肾砂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片列赎。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镐确,靈堂內(nèi)的尸體忽然破棺而出包吝,到底是詐尸還是另有隱情,我是刑警寧澤源葫,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布诗越,位于F島的核電站,受9級特大地震影響息堂,放射性物質(zhì)發(fā)生泄漏嚷狞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一荣堰、第九天 我趴在偏房一處隱蔽的房頂上張望床未。 院中可真熱鬧,春花似錦振坚、人聲如沸薇搁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啃洋。三九已至,卻和暖如春屎鳍,著一層夾襖步出監(jiān)牢的瞬間宏娄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工逮壁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绝编,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像十饥,于是被迫代替她去往敵國和親窟勃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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