策略模式-代码重构(switch-case,if-else)

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)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值