项目中用到的策略模式

所在项目:产品中心
功能点:数据校验接口
该接口用于校验产品中心的数据的正确性,根据数据类型校验,如果是数字类型的数据走数字类型的校验方法,如果是checkbox类型的数据走checkbox类型的数据校验方法。
模式讲解:
策略模式为了避免重复多重使用if-else语句,将每一个if块作为一种策略对象。UML键下图:


213204wlfs5l777x79flxo.png

策略模式包含四个角色:
(1) Strategy工厂,用于生产具体的Strategy

public class StrategyFactory {
    private static  StrategyFactory factory = newStrategyFactory();
    private static Map 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.策略很多的话会有很多策略对象

你可能感兴趣的:(项目中用到的策略模式)