介绍
这期内容当中小编将会给大家带来有关怎么消除春季代码中的if - else/切换实例,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
switch (, type ), { ,case case1: ,,… ,,… 打破才能; ,case 病例2: ,,… ,,… 打破才能; ,case case3: ,,… ,,… ,打破 ,默认值: return 才能;零; }
这样的代码不仅冗长,读起来也非常困难。做的好一点的会把这些逻辑封装成函数然后在分支中调用:
switch (, type ), { ,case case1: return 才能case1Func (); ,case 病例2: return 才能case2Func (); ,case case3: return 才能case3Func (); ,默认值: return 才能;零; }
即使这样也是面向过程思维的写法,以前写C程序的时候也总喜欢这样写,毫无设计模式可言。不仅违背开闭原则,而且随着切换实例分支的增多,该段代码只会越来越冗长。其实这种代码已经有成熟的模式去消除诸多的if - else/切换实例分支。本文就教大家在春天中如何用注解+策略模式+简单工厂的方式消除if - else/切换实例。我们就拿QQ空间的个人中心举例子,假如QQ空间个人中心有四个选项卡分别是列出我的说,说我的日志,我的照片和我的访客。一般的后台代码很有可能如下:
//各个,tab 名称的枚举: public enum  UserRelatedType {/* * *,才能说说 ,*/,SHUOSHUO(“说说“),/* * *,才能日志 ,*/,置(“日志“),/* * *,才能发布 ,*/,ZHAOPIAN(“照片“),/* * *,才能访客 ,*/,方可(“;”); ,private String  desc; ,UserRelatedType (String desc), { 时间=this.desc 才能;desc; ,} ,public String  getDesc (), { return 才能;desc; ,} ,public void  setDesc (String desc), { 时间=this.desc 才能;desc; ,} }
列出QQ用户个人中心相关标签的代码:
public List, listRelated (UserRelatedQuery 查询){ ,UserRelatedType relatedType =, UserRelatedType.valueOf (StringUtils.upperCase (query.getType ()),); ,switch (, relatedType ), { case 才能;SHUOSHUO: ,,return listRelatedShuoshuo (, query ); case 才能;置: ,,return listRelatedRizhi (, query ); case 才能;ZHAOPIAN: ,,return listRelatedZhaopian (, query ); case 才能;方可: ,,return listRelatedFangke (, query ); 默认值:才能 ,,return 零; ,} }
<>强而采用注解+策略模式+简单工厂,重构后代码如下:
强>
1,定义一个注解,用来完全消除if - else:
@Target (ElementType.TYPE) @Retention (RetentionPolicy.RUNTIME) public @interface  RelatedTypeAnnotation {/* * *,才能用户相关类型名称 ,*/,UserRelatedType 价值(); }
2,先定义了个接口,所有选项卡都要实现该接口。其列表中是标签数据展示的方法。
public interface UserRelated {/* * *,才能列出详细信息 ,* *,才能@param 查询 *才能@return ,*/,List列表(UserRelatedQuery 查询); }
3,定义具体的各个选项卡的实现,继承UserRelated策略接口
我的说说
@ component (“userRelatedShuoshuo") @RelatedTypeAnnotation (=,, value  UserRelatedType.SHUOSHUO ) public class  UserRelatedShuoshuo implements UserRelated  { ,@Override ,public List< UserRelatedVO>,列表(UserRelatedQuery 查询),{ System.out.println才能(“我的说说!“); return 才能;列表; ,} }
我的日志
@ component (“userRelatedRizhi") @RelatedTypeAnnotation (=,, value  UserRelatedType.RIZHI ) public class  UserRelatedRizhi implements UserRelated  { ,@Override ,public List< UserRelatedVO>,列表(UserRelatedQuery 查询),{ System.out.println才能(“我的日志!“); return 才能;列表; ,} }
我的照片