您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java怎么利用策略模式優化過多if else代碼,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
前言
不出意外,這應該是年前最后一次分享,本次來一點實際開發中會用到的小技巧。
比如平時大家是否都會寫類似這樣的代碼:
if(a){ //dosomething }else if(b){ //doshomething }else if(c){ //doshomething } else{ ////doshomething }
條件少還好,一旦 else if 過多這里的邏輯將會比較混亂,并很容易出錯。
比如這樣:
摘自cim 中的一個客戶端命令的判斷條件。
剛開始條件較少,也就沒管那么多直接寫的;現在功能多了導致每次新增一個 else 條件我都得仔細核對,生怕影響之前的邏輯。
這次終于忍無可忍就把他重構了,重構之后這里的結構如下:
最后直接變為兩行代碼,簡潔了許多。
而之前所有的實現邏輯都單獨抽取到其他實現類中。
這樣每當我需要新增一個 else 邏輯,只需要新增一個類實現同一個接口便可完成。每個處理邏輯都互相獨立互不干擾。
實現
按照目前的實現畫了一個草圖。
整體思路如下:
定義一個 InnerCommand 接口,其中有一個 process 函數交給具體的業務實現。
根據自己的業務,會有多個類實現 InnerCommand 接口;這些實現類都會注冊到 Spring Bean 容器中供之后使用。
通過客戶端輸入命令,從 Spring Bean 容器中獲取一個 InnerCommand 實例。
執行最終的 process 函數。
主要想實現的目的就是不在有多個判斷條件,只需要根據當前客戶端的狀態動態的獲取 InnerCommand 實例。
從源碼上來看最主要的就是 InnerCommandContext 類,他會根據當前客戶端命令動態獲取 InnerCommand 實例。
第一步是獲取所有的 InnerCommand 實例列表。
根據客戶端輸入的命令從第一步的實例列表中獲取類類型。
根據類類型從 Spring 容器中獲取具體實例對象。
因此首先第一步需要維護各個命令所對應的類類型。
所以在之前的枚舉中就維護了命令和類類型的關系,只需要知道命令就能知道他的類類型。
這樣才能滿足只需要兩行代碼就能替換以前復雜的 if else,同時也能靈活擴展。
InnerCommand instance = innerCommandContext.getInstance(msg); instance.process(msg) ;
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java怎么利用策略模式優化過多if else代碼”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。