日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

业务代码中,太多 if else 怎么办?

發(fā)布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 业务代码中,太多 if else 怎么办? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前段時間,我將公司系統(tǒng)中的批量審單的功能進行了重構,用到了java的并發(fā)編程進行異步化處理,數(shù)據(jù)庫的樂觀鎖機制處理多線程并發(fā)更新數(shù)據(jù)。其中批量審單的業(yè)務處理涉及到多種任務類型,對應不同的業(yè)務方法進行處理,比如轉(zhuǎn)倉,轉(zhuǎn)快遞,添加贈品,刪除贈品,拆分訂單,批量駁回,批量作廢等等,其中就用到了策略模式。

if else模式

????????if?("BATCH_CHANGE_WAREHOUSE".equals(taskType))?{//批量轉(zhuǎn)倉邏輯}?else?if?("BATCH_CHANGE_SHIPPING".equals(taskType))?{//批量轉(zhuǎn)快遞邏輯}?else?if?("BATCH_REPLACE_ORDER_GOODS".equals(taskType))?{//批量替換訂單商品邏輯}?else?if?("BATCH_DELETE_ORDER_GOODS".equals(taskType))?{//批量刪除訂單商品邏輯}?else?if?("BATCH_ADD_MEMO".equals(taskType))?{//批量添加備注邏輯}?else?{//任務類型未知System.out.println("任務類型無法處理");}

看起來,思路清晰,if,else分支也很清楚,但不覺得代碼很臃腫,維護起來麻煩嗎,尤其是其他人來接鍋的時候,連看下去的欲望都沒有了。這時候你需要用策略模式消除其中的if else,進行一下簡單的重構!

策略模式

1、首先抽象業(yè)務處理器

public?abstract?class?InspectionSolver?{public?abstract?void?solve(Long?orderId,?Long?userId);public?abstract?String[]?supports(); }

2、將業(yè)務處理器和其支持處理的類型放到一個容器中,java里Map就是最常用的容器之一

@Component public?class?InspectionSolverChooser?implements?ApplicationContextAware{private?Map<String,?InspectionSolver>?chooseMap?=?new?HashMap<>();public?InspectionSolver?choose(String?type)?{return?chooseMap.get(type);}@PostConstructpublic?void?register()?{Map<String,?InspectionSolver>?solverMap?=?context.getBeansOfType(InspectionSolver.class);for?(InspectionSolver?solver?:?solverMap.values())?{for?(String?support?:?solver.supports())?{chooseMap.put(support,solver);}}}private?ApplicationContext?context;@Overridepublic?void?setApplicationContext(ApplicationContext?applicationContext)?throws?BeansException?{this.context=applicationContext;} }

這里是在應用啟動的時候,加載spring容器中所有InspectionSolver類型的處理器,放到InspectionSolverChooser的map容器中。注意是InspectionSolver類型,所以定義的處理器都得繼承InspectionSolver,其次是spring容器中的才能加載,所以定義的處理器都得放到spring容器中(@Component注解不能少)

3、定義不同的處理器

@Component public?class?ChangeWarehouseSolver?extends?InspectionSolver?{@Overridepublic?void?solve(Long?orderId,?Long?userId)?{System.out.println("訂單"+orderId+"開始進行批量轉(zhuǎn)倉了。。");}@Overridepublic?String[]?supports()?{return?new?String[]?{InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE};} }@Component public?class?ChangeShippingSolver?extends?InspectionSolver{@Overridepublic?void?solve(Long?orderId,?Long?userId)?{System.out.println("訂單"+orderId+"開始進行轉(zhuǎn)快遞了。。");}@Overridepublic?String[]?supports()?{return?new?String[]?{InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_SHIPPING};} }@Component public?class?ReplaceOrderGoodsSolver?extends?InspectionSolver{@Overridepublic?void?solve(Long?orderId,?Long?userId)?{System.out.println("訂單"+orderId+"開始進行替換商品了");}@Overridepublic?String[]?supports()?{return?new?String[]{InspectionConstant.INSPECTION_TASK_TYPE_BATCH_REPLACE_ORDER_GOODS};} }

4、測試類

@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes=Application.class)//?指定spring-boot的啟動類 public?class?InspectionTest?{@Autowiredprivate?InspectionSolverChooser?chooser;@Testpublic?void?test()?throws?Exception{//準備數(shù)據(jù)String?taskType?=?InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE;Long?orderId?=?12345L;Long?userId?=?123L;//獲取任務類型對應的solverInspectionSolver?solver?=?chooser.choose(taskType);if?(solver?==?null)?{throw?new?RuntimeException("任務類型暫時無法處理!");}//調(diào)用不同solver的方法進行處理solver.solve(orderId,userId);} }

在測試類中我消除了可能一長段的if else,從選擇器InspectionSolverChooser中根據(jù)type的不同取出不同的任務處理器InspectionSolver,然后調(diào)用其solve()方法進行任務處理,不同處理器調(diào)用的當然就是不同的solve()方法了,目的達到。

總結

以上是生活随笔為你收集整理的业务代码中,太多 if else 怎么办?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。