問題引入
曾幾何時,我其實也特別鍾情於 if/else連環寫法,上來就是一頓SAO操作
比如這裡舉個好理解的簡單栗子:
一般來說我們正常的後臺管理系統都有所謂的角色的概念,不同管理員權限不一樣,能夠行使的操作也不一樣,比如:
- 系統管理員( ROLE_ROOT_ADMIN):有 A操作權限
- 訂單管理員( ROLE_ORDER_ADMIN):有 B操作權限
- 普通用戶( ROLE_NORMAL):有 C操作權限
比如一個用戶進來,我們需要根據不同用戶的角色來判斷其有哪些行為,注意,這時候SAO代碼出現了:
這樣寫到底有什麼不好呢?你想想看,假如系統裡有幾十個角色,或者以後要是再加幾個角色,那幾十個 if/else嵌套可以說是非常酸爽了…… 這樣一來非常不優雅,別人閱讀起來很費勁;二來則是以後如果再複雜一點,或者想要再加條件的話不好擴展;而且代碼一改,以前的老功能肯定還得重測,豈不瘋了……
當然有人會說用 switch/case來寫是否會優雅一些呢?答案是:毛區別都沒有!
接下來簡單講幾種改進方式,別再 if/else走天下了
有枚舉為啥不用
什麼角色能幹什麼事,這很明顯有一個對應關係,所以學過的枚舉為啥不用呢?
首先定義一個公用接口 RoleOperation,表示不同角色所能做的操作:
接下來我們將不同角色的情況全部交由枚舉類來做,定義一個不同角色有不同權限的枚舉類 RoleEnum:
接下來調用就變得異常簡單了,一行代碼就行了, if/else也灰飛煙滅了:
而且這樣一來,以後假如我想擴充條件,只需要去枚舉類中加代碼即可,而不是去改以前的代碼,這豈不很穩!
除了用枚舉來消除 if/else,工廠模式也可以實現
有工廠模式為啥不用
不同分支做不同的事情,很明顯就提供了使用工廠模式的契機,我們只需要將不同情況單獨定義好,然後去工廠類裡面聚合即可。
首先,針對不同的角色,單獨定義其業務類:
接下來再寫一個工廠類 RoleFactory對上面不同角色進行聚合:
接下來藉助上面這個工廠,業務代碼調用也只需一行代碼, if/else同樣被消除了:
這樣的話以後想擴展條件也很容易,只需要增加新代碼,而不需要動以前的業務代碼,非常符合“開閉原則”。
來,我們接著來,除了工廠模式,策略模式也不妨試一試
有策略模式為啥不用
策略模式和工廠模式寫起來其實區別也不大!
在上面工廠模式代碼的基礎上,按照策略模式的指導思想,我們也來創建一個所謂的
策略上下文類,這裡命名為 RoleContext:很明顯上面傳入的參數 operation就是表示不同的“策略”。我們在業務代碼裡傳入不同的角色,即可得到不同的操作結果:
後 記
好啦,先講到這裡吧,本文僅僅是拋磚引玉,使用了一個極其簡單的示例來打了個樣,然而其思想可以廣泛地應用於實際複雜的業務和場景,思想真的很重要!寫代碼前還是得多思考一番,考慮是否有更具擴展性的寫法。
閱讀更多 編程界大佬1 的文章