所在项目:产品中心
功能点:数据校验接口
该接口用于校验产品中心的数据的正确性,根据数据类型校验,如果是数字类型的数据走数字类型的校验方法,如果是checkbox类型的数据走checkbox类型的数据校验方法。
模式讲解:
策略模式为了避免重复多重使用if-else语句,将每一个if块作为一种策略对象。UML键下图:
策略模式包含四个角色:
(1) Strategy工厂,用于生产具体的Strategy
public class StrategyFactory {
private static StrategyFactory factory = newStrategyFactory();
private static Map<String,Object> strategyMap = newConcurrentHashMap<>();
private StrategyFactory(){
}
static{
//文本框、密码
strategyMap.put(ParamTypeEnum.TEXT.getName(), newTextCheckStrategy());
//数字框
strategyMap.put(ParamTypeEnum.NUMBER.getName(), newNumberCheckStrategy());
//范围
strategyMap.put(ParamTypeEnum.RANGE.getName(), newRangeCheckStrategy());
//内联复选框
strategyMap.put(ParamTypeEnum.CHECKBOX.getName(), newCheckBoxCheckStrategy());
}
public Strategycreator(String type){
return (Strategy) strategyMap.get(type);
}
public staticStrategyFactory getInstance(){
return factory;
}
}
(2) 抽象策略角色
public interface Strategy {
/**
*数据校验
*dbvalue:为数据库中的字段
*paramValue:接口传递的参数
*
*@param dbvalue
*@param paramValue
*
*/
public StringcheckData(Object paramValue, String dbValue);
}
(3)具体策略角色,相当于if块
public class NumberCheckStrategy implementsStrategy{}
public class CheckBoxCheckStrategy implementsStrategy {}
客户端调用为:
NumberCheckStrategynumberStrategy= (NumberCheckStrategy) StrategyFactory.getInstance().creator(itemType);
ret = numberStrategy.checkData(paramValue, dbValue);
CheckBoxCheckStrategycheckBoxStrategy= (CheckBoxCheckStrategy)StrategyFactory.getInstance().creator(itemType);
ret = checkBoxStrategy.checkData(paramValue, dbValue);
优点:可以扩展任意类型的数据校验,例如添加radio,text等类型的数据校验。
缺点:1.客户端必须要知道所有的策略,2.策略很多的话会有很多策略对象