ifelse 与switchcase是项目中常见令人头疼的代码。如何优雅的实现,让人感到不那么low 最近在学习策略模式,发现策略模式能很好的解决这种冗余的问题,主要思路是将变化的部分与不变的部分分开,抽出公共的部分提取出,再根据类型封装实现类,最后根据类型调用统一的方法
本文主要针对对象的封装比如说封装用户名字,封装日期 或者枚举
1定义顶层接口
/**
* 翻译service
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:11:09
* @since 0.0.1
*/
public interface Translator {
/**
* 翻译对象的属性类型
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:13:00
* @since 0.0.1
* @return
* Integer
*/
Integer attrType();
/**
* 获取翻译后的结果
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:12:26
* @since 0.0.1
* @return
* String
*/
Object translator(Object param);
/**
* 根据类型反向翻译
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:15:23
* @since 0.0.1
* @param param
* @return
* Object
*/
Object unTranslator(Object param);
}
2定义接口实现类
/**
* 日期翻译工具类
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:16:10
* @since 0.0.1
*/
@Service
public class DateTranslator implements Translator{
@Override
public Integer attrType() {
// TODO Auto-generated method stub
return AttrType.TYPE_DATE.getCode();
}
@Override
public Object translator(Object param) {
if(param == null) return null;
return ValidateUtil.isEmpty(param) ? "" : DateUtil.format((Timestamp)param, DateUtil.YYYY_MM_DD_HH_MM_SS);
}
@Override
public Object unTranslator(Object param) {
if(param == null) return null;
if(param instanceof String){
return DateUtil.parse(param.toString());
}
return param;
}
}
/**
* 文本翻译工具类
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:16:10
* @since 0.0.1
*/
@Service
public class FileTranslator implements Translator{
@Autowired
private FileGridService fileGridService;
@Override
public Integer attrType() {
// TODO Auto-generated method stub
return AttrType.TYPE_FILE.getCode();
}
@Override
public Object translator(Object param) {
if(ValidateUtil.isEmpty(param)){
return "";
}
String[] fileIds = param.toString().split(",");
StringBuffer sbuffer = new StringBuffer();
for (String fileId : fileIds) {
GridFSDBFile findOne = fileGridService.findOne(fileId);
if(findOne != null&& ValidateUtil.isNotEmpty(findOne.getFilename())){
sbuffer.append(findOne.getFilename()+",");
}
}
return ValidateUtil.isEmpty(sbuffer) ? "" : sbuffer.toString().substring(0, sbuffer.toString().length()-1);
}
@Override
public Object unTranslator(Object param) {
// TODO Auto-generated method stub
return param;
}
}
/**
* 文本翻译工具类
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午4:16:10
* @since 0.0.1
*/
@Service
public class TextTranslator implements Translator{
@Override
public Integer attrType() {
// TODO Auto-generated method stub
return AttrType.TYPE_TEXT.getCode();
}
@Override
public Object translator(Object param) {
return param;
}
@Override
public Object unTranslator(Object param) {
// TODO Auto-generated method stub
return param;
}
}
3.定义路由与实现
/**
*
*
*<hr>
* @author hanjidong
* @date 2020年11月12日 下午5:45:27
* @since 0.0.1
*/
@Service
public class TranslateService {
@Resource
private Translator[] translatorService;
public Translator route(Integer attrType) {
for (Translator translator : translatorService) {
if (Objects.equals(attrType, translator.attrType())) {
return translator;
}
}
System.out.println(attrType);
throw new IllegalArgumentException("属性类型,不符合规范");
}
public Object translator(Integer attrType, Object param) {
Translator translator = route(attrType);
if (translator == null) {
throw new IllegalArgumentException("属性类型,不符合规范");
}
return translator.translator(param);
}
public Object untranslator(Integer attrType, Object value) {
Translator translator = route(attrType);
if (translator == null) {
throw new IllegalArgumentException("属性类型,不符合规范");
}
return translator.unTranslator(value);
}
}
接口的调用
@Autowired
private TranslateService translateService;
public void translate(formType,property) {
translateService.translator(Integer.parseInt(formType), property)
}