中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么消除Spring代碼中的if-else/switch-case

發布時間:2021-01-16 10:29:36 來源:億速云 閱讀:225 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關怎么消除Spring代碼中的if-else/switch-case,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

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

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

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

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

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

 /**
  * 發布
  */
 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 都要實現該接口。其中 list 是 tab 數據展示的方法。

public interface UserRelated {

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

3、定義具體的各個 tab 的實現,繼承 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、定義一個簡單工廠,用來生產各種 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、調用的代碼(listRelated 會在 controller 中被調用)。

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 實現其中的 list,并加上相應的注解即可。

上述就是小編為大家分享的怎么消除Spring代碼中的if-else/switch-case了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武定县| 聂荣县| 甘孜县| 淮北市| 甘谷县| 德钦县| 玉屏| 浦县| 绥宁县| 景德镇市| 临朐县| 华容县| 华亭县| 梁山县| 昌黎县| 龙海市| 剑川县| 麟游县| 高邑县| 泊头市| 长岭县| 连城县| 石台县| 卢湾区| 仁寿县| 咸丰县| 休宁县| 宝山区| 台北市| 绥德县| 利辛县| 浑源县| 腾冲县| 新乡市| 绥滨县| 长宁县| 金门县| 五峰| 常宁市| 饶阳县| 大埔县|