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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

答应我,别再if/else走天下了可以吗

發(fā)布時間:2024/9/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 答应我,别再if/else走天下了可以吗 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


?哎,曾幾何時?

想當年,其實我也特別鐘情于 if/else連環(huán)寫法,上來就是一頓SAO操作,比如舉個好理解的簡單栗子

一般來說我們正常的后臺管理系統(tǒng)都有所謂的角色的概念,不同管理員權(quán)限不一樣,能夠行使的操作也不一樣,比如:

  • 系統(tǒng)管理員(?ROLE_ROOT_ADMIN):有?A操作權(quán)限

  • 訂單管理員(?ROLE_ORDER_ADMIN):有?B操作權(quán)限

  • 普通用戶(?ROLE_NORMAL):有?C操作權(quán)限

比如一個用戶進來,我們需要根據(jù)不同用戶的角色來判斷其有哪些行為,這時候SAO代碼出現(xiàn)了:

public class JudgeRole {public String judge( String roleName ) {String result = "";if (roleName.equals("ROLE_ROOT_ADMIN")) { // 系統(tǒng)管理員有A權(quán)限r(nóng)esult = "ROLE_ROOT_ADMIN: " + "has AAA permission";} else if ( roleName.equals("ROLE_ORDER_ADMIN") ) { // 訂單管理員有B權(quán)限r(nóng)esult = "ROLE_ORDER_ADMIN: " + "has BBB permission";} else if ( roleName.equals("ROLE_NORMAL") ) { // 普通用戶有C權(quán)限r(nóng)esult = "ROLE_NORMAL: " + "has CCC permission";} else {result = "XXX";}return result;} }

這樣當系統(tǒng)里有幾十個角色時,那幾十個 if/else嵌套可以說是非常酸爽了…… 這樣一來非常不優(yōu)雅,別人閱讀起來很費勁;二來則是以后如果再復雜一點,或者想要再加條件的話不好擴展;而且代碼一改,以前的老功能肯定還得重測,豈不瘋了……

所以,如果在不看下文的情況下,你一般會如何去對付這些令人頭痛的if/else語句呢?

當然有人會說用 switch/case來寫是否會優(yōu)雅一些呢?答案是:毛區(qū)別都沒有

接下來簡單講幾種改進方式,別再 if/else走天下了


?有枚舉為啥不用?

什么角色能干什么事,這很明顯有一個對應(yīng)關(guān)系,所以學過的枚舉為啥不用呢?

首先定義一個公用接口 RoleOperation,表示不同角色所能做的操作:

public interface RoleOperation {String op(); // 表示某個角色可以做哪些op操作 }

接下來我們將不同角色的情況全部交由枚舉類來做,定義一個不同角色有不同權(quán)限的枚舉類 RoleEnum:

public enum RoleEnum implements RoleOperation {// 系統(tǒng)管理員(有A操作權(quán)限)ROLE_ROOT_ADMIN {@Overridepublic String op() {return "ROLE_ROOT_ADMIN:" + " has AAA permission";}},// 訂單管理員(有B操作權(quán)限)ROLE_ORDER_ADMIN {@Overridepublic String op() {return "ROLE_ORDER_ADMIN:" + " has BBB permission";}},// 普通用戶(有C操作權(quán)限)ROLE_NORMAL {@Overridepublic String op() {return "ROLE_NORMAL:" + " has CCC permission";}}; }

接下來調(diào)用就變得異常簡單了,一行代碼就行了, if/else也灰飛煙滅了:

public class JudgeRole {public String judge( String roleName ) {// 一行代碼搞定!之前的if/else沒了!return RoleEnum.valueOf(roleName).op();} }

而且這樣一來,以后假如我想擴充條件,只需要去枚舉類中加代碼即可,而不是去改以前的代碼,這豈不很穩(wěn)!

除了用枚舉來消除 if/else,工廠模式也可以實現(xiàn)


?有工廠模式為啥不用?

不同分支做不同的事情,很明顯就提供了使用工廠模式的契機,我們只需要將不同情況單獨定義好,然后去工廠類里面聚合即可。

首先,針對不同的角色,單獨定義其業(yè)務(wù)類:

// 系統(tǒng)管理員(有A操作權(quán)限) public class RootAdminRole implements RoleOperation {private String roleName;public RootAdminRole( String roleName ) {this.roleName = roleName;}@Overridepublic String op() {return roleName + " has AAA permission";} } // 訂單管理員(有B操作權(quán)限) public class OrderAdminRole implements RoleOperation {private String roleName;public OrderAdminRole( String roleName ) {this.roleName = roleName;}@Overridepublic String op() {return roleName + " has BBB permission";} } // 普通用戶(有C操作權(quán)限) public class NormalRole implements RoleOperation {private String roleName;public NormalRole( String roleName ) {this.roleName = roleName;}@Overridepublic String op() {return roleName + " has CCC permission";} }

接下來再寫一個工廠類 RoleFactory對上面不同角色進行聚合:

public class RoleFactory {static Map<String, RoleOperation> roleOperationMap = new HashMap<>();// 在靜態(tài)塊中先把初始化工作全部做完static {roleOperationMap.put( "ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN") );roleOperationMap.put( "ROLE_ORDER_ADMIN", new OrderAdminRole("ROLE_ORDER_ADMIN") );roleOperationMap.put( "ROLE_NORMAL", new NormalRole("ROLE_NORMAL") );}public static RoleOperation getOp( String roleName ) {return roleOperationMap.get( roleName );} }

接下來借助上面這個工廠,業(yè)務(wù)代碼調(diào)用也只需一行代碼, if/else同樣被消除了:

public class JudgeRole {public String judge( String roleName ) {// 一行代碼搞定!之前的 if/else也沒了!return RoleFactory.getOp(roleName).op();} }

這樣的話以后想擴展條件也很容易,只需要增加新代碼,而不需要動以前的業(yè)務(wù)代碼,非常符合“開閉原則”

來,我們接著來,除了工廠模式,策略模式也不妨試一試


?有策略模式為啥不用?

策略模式和工廠模式寫起來其實區(qū)別也不大!

在上面工廠模式代碼的基礎(chǔ)上,按照策略模式的指導思想,我們也來創(chuàng)建一個所謂的策略上下文類,這里命名為 RoleContext:

public class RoleContext {// 可更換的策略,傳入不同的策略對象,業(yè)務(wù)即相應(yīng)變化private RoleOperation operation; public RoleContext( RoleOperation operation ) {this.operation = operation;}public String execute() {return operation.op();} }

很明顯上面?zhèn)魅氲膮?shù) operation就是表示不同的“策略”。我們在業(yè)務(wù)代碼里傳入不同的角色,即可得到不同的操作結(jié)果:

public class JudgeRole {public String judge( RoleOperation roleOperation ) {RoleContext roleContext = new RoleContext( roleOperation );return roleContext.execute();} } public static void main( String[] args ) {JudgeRole judgeRole = new JudgeRole();String result1 = judgeRole.judge(new RootAdminRole("ROLE_ROOT_ADMIN"));System.out.println( result1 );String result2 = judgeRole.judge(new OrderAdminRole("ROLE_ORDER_ADMIN"));System.out.println( result2 );String result3 = judgeRole.judge(new NormalRole("ROLE_NORMAL"));System.out.println( result3 ); }

?共? ?勉?

好了,先講到這里吧,本文僅僅是拋磚引玉,使用了一個極其簡單的示例來打了個樣,然而其思想可以廣泛地應(yīng)用于實際復雜的業(yè)務(wù)和場景,思想真的很重要!寫代碼前還是得多思考一番,考慮是否有更具可擴展性的寫法!


后? ?記

若有錯誤或者不當之處,可在本公眾號內(nèi)反饋,一起學習交流!

The End來和小伙伴們一起向上生長呀!掃描下方二維碼,添加小詹微信,可領(lǐng)取千元大禮包并申請加入 Python 學習交流群,群內(nèi)僅供學術(shù)交流,日常互動,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!????長按識別,添加微信(添加人數(shù)較多,請耐心等待)????長按識別,關(guān)注小詹(掃碼回復 1024 領(lǐng)取程序員大禮包) 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的答应我,别再if/else走天下了可以吗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: xxxxxx黄色| 精品一区二区三区免费毛片 | 久久久精品久 | 91玉足脚交白嫩脚丫 | 六月婷婷中文字幕 | 国产porn| 国产综合在线观看 | 日本一二区视频 | 亚洲丝袜视频 | 亚洲午夜精品一区 | 国产精品久久久久久久久免费 | 大肉大捧一进一出好爽视频 | 久色视频在线播放 | 久久久久99精品成人片我成大片 | 中文字幕av亚洲精品一部二部 | 高潮喷水一区二区三区 | 国产精品99久久久久久人 | 香蕉视频在线播放 | hd丰满圆润的女人hd | 操小妹影院 | 青草视频在线看 | 黄色午夜影院 | 一二三区在线视频 | 亚洲区综合 | 天堂资源在线 | 少妇太爽了| 精品婷婷色一区二区三区蜜桃 | 亚洲天堂三区 | 国产精品美女久久久免费 | 国产在线一卡二卡 | 久久成人在线 | 四虎网址在线 | 男生和女生一起差差差很痛的视频 | 天堂最新资源在线 | 四虎成人精品永久免费av | 黄色一级片一级片 | 久久网站免费 | 亚洲啪啪免费视频 | 亚洲视频一区在线播放 | 狠狠av| 日韩激情毛片 | 午夜久久久久久噜噜噜噜 | 玖玖国产精品视频 | 一区二区三区四区免费视频 | 日韩精品一级 | 亚洲欧洲成人在线 | 亚洲高清在线播放 | 中文字幕Av日韩精品 | 二区三区在线视频 | 午夜免费福利在线 | 你懂的在线观看网站 | 麻豆av在线| 欧美日韩一级视频 | 男人操女人下面视频 | 天堂a在线 | 久久久99精品国产一区二区三区 | 日韩中文字幕在线观看视频 | 欧美电影一区二区三区 | 校园激情av | 97成人精品 | 亚洲欧美一区二区三区在线观看 | 一区二区伦理 | 国产麻豆一区二区 | 在线免费日韩 | 国产夫妻性生活视频 | 欧州一区二区三区 | www.国产精品 | 欧美特黄 | 你懂的网站在线 | 噜噜色综合 | 成人看片在线观看 | 久草免费新视频 | 蜜桃视频无码区在线观看 | 亚洲精品日韩精品 | 懂色av中文一区二区三区天美 | 91免费视频网 | 天天干天天爽天天操 | 涩涩片影院| 天天干天天日夜夜操 | 免费看裸体视频网站 | 国产aa| 少妇人妻偷人精品无码视频 | 黄骗免费网站 | 日本高清不卡视频 | 狠狠躁18三区二区一区传媒剧情 | 久久久精品日本 | 午夜资源网| 久久午夜免费视频 | 黑人av| 亚洲一区激情 | 91亚洲视频在线观看 | 乱子伦一区 | 国产黄色网络 | 中文字幕一区二区三区乱码 | 成人精品在线看 | 国产盗摄在线观看 | 日日噜噜噜 | 国产精品毛片久久久 | 任你操精品视频 |