欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

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

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

//各個 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 用戶個人中心相關 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;
 }
}

而采用注解+策略模式+簡單工廠,重構后代碼如下:

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

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

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

public interface UserRelated {

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

3、定義具體的各個 tab 的實現(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、定義一個從 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、定義一個簡單工廠,用來生產(chǎn)各種 tab 對象。

@Component
public class UserRelatedFactory {

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

 //工廠將 Spring 裝配的相關的 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 會在 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;
 }
}

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

其實這是一種通用的解決方案,當你 if-else/switch-case 的分支超過 3 個、且分支代碼相似且冗長的情況下就應該考慮這種模式。這種模式寫出的代碼面向對象、清晰、易擴展還高大上,何樂而不為呀,趕緊試試吧!

總結

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

相關文章

  • Java使用PreparedStatement接口及ResultSet結果集的方法示例

    Java使用PreparedStatement接口及ResultSet結果集的方法示例

    這篇文章主要介紹了Java使用PreparedStatement接口及ResultSet結果集的方法,結合實例形式分析了PreparedStatement接口及ResultSet結果集的相關使用方法與操作注意事項,需要的朋友可以參考下
    2018-07-07
  • Java多線程 原子性操作類的使用

    Java多線程 原子性操作類的使用

    這篇文章主要介紹了Java多線程 原子性操作類的使用,在java5以后,我們接觸到了線程原子性操作,也就是在修改時我們只需要保證它的那個瞬間是安全的即可,經(jīng)過相應的包裝后可以再處理對象的并發(fā)修改,本文總結一下Atomic系列的類的使用方法,下面一起進入文章了解詳細內(nèi)容
    2021-10-10
  • Java創(chuàng)建與結束線程代碼示例

    Java創(chuàng)建與結束線程代碼示例

    這篇文章主要介紹了Java創(chuàng)建與結束線程代碼示例,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • java集合框架的體系結構詳細說明

    java集合框架的體系結構詳細說明

    最近在一本J2EE的書中看到了很不錯的對集合框架的說明文章
    2012-11-11
  • 解決java數(shù)值范圍以及float與double精度丟失的問題

    解決java數(shù)值范圍以及float與double精度丟失的問題

    下面小編就為大家?guī)硪黄鉀Qjava數(shù)值范圍以及float與double精度丟失的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 關于@Value注解失效的原因分析

    關于@Value注解失效的原因分析

    這篇文章主要介紹了關于@Value注解失效的原因分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring三級緩存思想解決循環(huán)依賴總結分析

    Spring三級緩存思想解決循環(huán)依賴總結分析

    這篇文章主要為大家介紹了Spring三級緩存思想解決循環(huán)依賴總結分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java 5個人坐在一起(有關第五個人歲數(shù)的問題)

    Java 5個人坐在一起(有關第五個人歲數(shù)的問題)

    利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推,需要的朋友可以參考下
    2017-02-02
  • Java8新特性之Base64詳解_動力節(jié)點Java學院整理

    Java8新特性之Base64詳解_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Java8新特性之Base64的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 淺談IDEA中Maven配置問題全解決

    淺談IDEA中Maven配置問題全解決

    這篇文章主要介紹了淺談IDEA中Maven配置問題全解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論