最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring如何消除代碼中的if-else/switch-case

 更新時(shí)間:2019年04月09日 09:14:11   作者:水目沾  
這篇文章主要給大家介紹了關(guān)于Spring如何消除代碼中if-else/switch-case的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在很多時(shí)候,我們代碼中會(huì)有很多分支,而且分支下面的代碼又有一些復(fù)雜的邏輯,相信很多人都喜歡用 if-else/switch-case 去實(shí)現(xiàn)。做的不好的會(huì)直接把實(shí)現(xiàn)的代碼放在 if-else/switch-case 的分支之下:

switch ( type ) {
 case case1:
  ...
  ...
  break;
 case case2:
  ...
  ...
  break;
 case case3:
  ...
  ...
  break
 default:
  return null;
}

這樣的代碼不僅冗長(zhǎng),讀起來也非常困難。做的好一點(diǎn)的會(huì)把這些邏輯封裝成函數(shù)然后在分支中調(diào)用:

switch ( type ) {
 case case1:
  return case1Func();
 case case2:
  return case2Func();
 case case3:
  return case3Func();
 default:
  return null;
}

即使這樣也是面向過程思維的寫法,以前寫 C 程序的時(shí)候也總喜歡這樣寫,毫無設(shè)計(jì)模式可言。不僅違背開閉原則,而且隨著 switch-case 分支的增多,該段代碼只會(huì)越來越冗長(zhǎng)。其實(shí)這種代碼已經(jīng)有成熟的模式去消除諸多的 if-else/switch-case 分支。本文就教大家在 Spring 中如何用注解+策略模式+簡(jiǎn)單工廠的方式消除 if-else/switch-case 。我們就拿 QQ 空間的個(gè)人中心舉例子,假如 QQ 空間個(gè)人中心有四個(gè) tab 分別是列出我的說說、我的日志、我的照片和我的訪客。一般的后臺(tái)代碼很有可能如下:

//各個(gè) tab 名稱的枚舉:
public enum UserRelatedType {
 /**
  * 說說
  */
 SHUOSHUO("說說"),

 /**
  * 日志
  */
 RIZHI("日志"),

 /**
  * 發(fā)布
  */
 ZHAOPIAN("照片"),

 /**
  * 訪客
  */
 FANGKE("");

 private String desc;

 UserRelatedType(String desc) {
  this.desc = desc;
 }

 public String getDesc() {
  return desc;
 }

 public void setDesc(String desc) {
  this.desc = desc;
 }
}

列出 QQ 用戶個(gè)人中心相關(guān) tab 的代碼:

public List<UserRelatedVO> listRelated(UserRelatedQuery query){

 UserRelatedType relatedType = UserRelatedType.valueOf(StringUtils.upperCase(query.getType()) );
 switch ( relatedType ) {
  case SHUOSHUO:
   return listRelatedShuoshuo( query );
  case RIZHI:
   return listRelatedRizhi( query );
  case ZHAOPIAN:
   return listRelatedZhaopian( query );
  case FANGKE:
   return listRelatedFangke( query );
  default:
   return null;
 }
}

而采用注解+策略模式+簡(jiǎn)單工廠,重構(gòu)后代碼如下:

1、定義一個(gè)注解,用來完全消除 if-else:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RelatedTypeAnnotation {
 /**
  * 用戶相關(guān)類型名稱
  */
 UserRelatedType value();
}

2、先定義了個(gè)接口,所有 tab 都要實(shí)現(xiàn)該接口。其中 list 是 tab 數(shù)據(jù)展示的方法。

public interface UserRelated {

 /**
  * 列出詳細(xì)信息
  *
  * @param query
  * @return
  */
 List<UserRelatedVO> list(UserRelatedQuery query);
}

3、定義具體的各個(gè) tab 的實(shí)現(xiàn),繼承 UserRelated 策略接口

我的說說

@Component("userRelatedShuoshuo")
@RelatedTypeAnnotation( value = UserRelatedType.SHUOSHUO )
public class UserRelatedShuoshuo implements UserRelated {
 @Override
 public List<UserRelatedVO> list(UserRelatedQuery query) {
  System.out.println("我的說說!");
  return list;
 }
}

我的日志

@Component("userRelatedRizhi")
@RelatedTypeAnnotation( value = UserRelatedType.RIZHI )
public class UserRelatedRizhi implements UserRelated {
 @Override
 public List<UserRelatedVO> list(UserRelatedQuery query) {
  System.out.println("我的日志!");
  return list;
 }
}

我的照片

@Component("userRelatedZhaopian")
@RelatedTypeAnnotation( value = UserRelatedType.ZHAOPIAN )
public class UserRelatedZhaopian implements UserRelated {
 @Override
 public List<UserRelatedVO> list(UserRelatedQuery query) {
  System.out.println("我的照片!");
  return list;
 }
}

我的訪客

@Component("userRelatedFangke")
@RelatedTypeAnnotation( value = UserRelatedType.FANGKE )
public class UserRelatedFangke implements UserRelated {
 @Override
 public List<UserRelatedVO> list(UserRelatedQuery query) {
  System.out.println("我的訪客!");
  return list;
 }
}

3、定義一個(gè)從 Spring context 獲取 bean 的工具類

@Component
public class SpringContextUtil implements ApplicationContextAware {

 private ApplicationContext context;

 public ApplicationContext getContext() {
  return context;
 }

 @Override
 public void setApplicationContext(ApplicationContext context)throws BeansException {
  this.context = context;
 }
}

4、定義一個(gè)簡(jiǎn)單工廠,用來生產(chǎn)各種 tab 對(duì)象。

@Component
public class UserRelatedFactory {

 @Autowired
 SpringContextUtil springContextUtil;
 
 private static Map<UserRelatedType, UserRelated> userRelatedMap = Maps.newConcurrentMap();

 //工廠將 Spring 裝配的相關(guān)的 Bean 用 Map 保存起來
 public UserRelatedFactory(){
  Map<String, Object> beanMap = springContextUtil.getContext().getBeansWithAnnotation(RelatedTypeAnnotation.class);

  for(Object userRelated : beanMap.values()) {
   RelatedTypeAnnotation annotation = userRelated.getClass().getAnnotation(RelatedTypeAnnotation.class);
   userRelatedMap.put(annotation.value(), (UserRelated)userRelated);
  }
 }

 public static UserRelated createRelated(UserRelatedType relatedType) {
  return userRelatedMap.get( relatedType );
 }
}

5、調(diào)用的代碼(listRelated 會(huì)在 controller 中被調(diào)用)。

public List<UserRelatedVO> listRelated(UserRelatedQuery query){

 UserRelatedType relatedType = UserRelatedType.valueOf(StringUtils.upperCase(query.getType()) );
 UserRelated related = UserRelatedFactory.createRelated( relatedType );
 if( related != null ) {
  return related.list( query );
 } else {
  return null;
 }
}

重構(gòu)后的代碼如果需要再新增一種 tab,比如我的好友,只需要新增一種類型繼承 UserRelated 實(shí)現(xiàn)其中的 list,并加上相應(yīng)的注解即可。

其實(shí)這是一種通用的解決方案,當(dāng)你 if-else/switch-case 的分支超過 3 個(gè)、且分支代碼相似且冗長(zhǎng)的情況下就應(yīng)該考慮這種模式。這種模式寫出的代碼面向?qū)ο?、清晰、易擴(kuò)展還高大上,何樂而不為呀,趕緊試試吧!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java字符串比較方法equals的空指針異常的解決

    Java字符串比較方法equals的空指針異常的解決

    這篇文章主要介紹了Java字符串比較方法equals的空指針異常的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java垃圾回收機(jī)制的finalize方法實(shí)例分析

    Java垃圾回收機(jī)制的finalize方法實(shí)例分析

    這篇文章主要介紹了Java垃圾回收機(jī)制的finalize方法,結(jié)合實(shí)例形式分析了finalize方法的特點(diǎn)及在垃圾回收機(jī)制中的相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • java8快速實(shí)現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作

    java8快速實(shí)現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作

    這篇文章主要介紹了java8快速實(shí)現(xiàn)List轉(zhuǎn)map 、分組、過濾等操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java中的方法、常量、變量、參數(shù)用例詳解

    Java中的方法、常量、變量、參數(shù)用例詳解

    在JVM的運(yùn)轉(zhuǎn)中,承載的是數(shù)據(jù),而數(shù)據(jù)的一種變現(xiàn)形式就是“量”,量分為:常量與變量,我們?cè)跀?shù)學(xué)和物理學(xué)中已經(jīng)接觸過變量的概念了,在Java中的變量就是在程序運(yùn)行過程中可以改變其值的量,這篇文章主要介紹了Java中的方法、常量、變量、參數(shù),需要的朋友可以參考下
    2024-01-01
  • 利用Java8 Optional類優(yōu)雅如何地解決空指針問題

    利用Java8 Optional類優(yōu)雅如何地解決空指針問題

    這篇文章主要給大家介紹了關(guān)于如何利用Java8 Optional類優(yōu)雅解決空指針問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper示例詳解

    Mybatis-Plus的條件構(gòu)造器QueryWrapper & UpdateWrapper示例詳解

    Mybatis-Plus的條件構(gòu)造器QueryWrapper和UpdateWrapper為開發(fā)者提供了強(qiáng)大、靈活的條件構(gòu)建工具,能夠大大簡(jiǎn)化數(shù)據(jù)庫操作的代碼,通過本文的介紹,讀者可以更加深入地理解這兩個(gè)條件構(gòu)造器的使用方法,并在實(shí)際項(xiàng)目中靈活應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • java正則表達(dá)式提取數(shù)字的方法實(shí)例

    java正則表達(dá)式提取數(shù)字的方法實(shí)例

    這篇文章主要介紹了java正則表達(dá)式提取數(shù)字的方法,還有去除字符串?dāng)?shù)字的方法,大家參考使用吧
    2013-12-12
  • Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法

    Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法

    這篇文章主要介紹了Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Springboot整合多數(shù)據(jù)源代碼示例詳解

    Springboot整合多數(shù)據(jù)源代碼示例詳解

    這篇文章主要介紹了Springboot整合多數(shù)據(jù)源代碼示例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼

    SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼

    本文主要介紹了SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

吴江市| 明水县| 吐鲁番市| 聂荣县| 高州市| 陵水| 图木舒克市| 太仓市| 保靖县| 呼玛县| 松溪县| 平湖市| 平湖市| 中超| 独山县| 油尖旺区| 滨州市| 宁晋县| 苗栗市| 海口市| 诸暨市| 建瓯市| 富裕县| 雷山县| 松桃| 旺苍县| 西丰县| 固始县| 旬阳县| 昌宁县| 平塘县| 龙口市| 青州市| 天台县| 香河县| 明星| 海宁市| 永平县| 淄博市| 阳春市| 安庆市|