策略模式(实际工作中的总结)

103 阅读1分钟

策略模式用途

  • 可替换掉if/else 或 switch 这种繁杂的编码方式
  • 代码扩展性好,易维护

编码实现

1.定义业务类型

/**
 * @describe:业务类型枚举类
 */
public enum TypeEnum {

    A("a","a类型"),
    B("b","b类型"),
    ;

    private String code;
    private String desc;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    TypeEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

2.定义策略基类

/**
 * @describe:  定义一个策略基类
 */
public interface IStrategy {

    /**
     * 校验  用户判断调用来个实现类
     * @param typeEnum
     * @return
     */
    boolean checkValid(TypeEnum typeEnum);

    /**
     * 处理业务  返回不同类型list对象
     * @param params
     * @param typeEnum
     * @return
     */
    List<?> doSomething(String params,TypeEnum typeEnum);
}

3.定义一个策略处理器类

/**
 * @describe:  StrategyHolder需要注入到bean
 */
@Component
public class StrategyHolder implements ApplicationContextAware {
    @Autowired
    private Collection<IStrategy> strategies;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //获取所有策略基类的实现类
        strategies = applicationContext.getBeansOfType(IStrategy.class).values();
    }


    /**
     * 获取具体的实现类
     * @param typeEnum
     * @return
     */
    public IStrategy getStrategy(TypeEnum typeEnum) {
        //这里要对是否在枚举类中 进行判断

        // 根据报告类型,解析报告
        for (IStrategy strategy : strategies) {
            if (strategy.checkValid(typeEnum)) {
                return strategy;
            }
        }
        return null;
    }
}

4.定义两个策略实现类

@Component
public class BStrategy implements IStrategy {

    @Override
    public boolean checkValid(TypeEnum typeEnum) {
        return TypeEnum.B.equals(typeEnum);
    }

    @Override
    public List<?> doSomething(String params, TypeEnum typeEnum) {
        //B操作
        List<Integer> list = new ArrayList<>();
        list.add(1);
        return list;
    }
}
@Component
public class AStrategy implements IStrategy {
    @Override
    public boolean checkValid(TypeEnum typeEnum) {
        return TypeEnum.A.equals(typeEnum);
    }

    @Override
    public List<?> doSomething(String params, TypeEnum typeEnum) {

        //A操作
        List<String> list = new ArrayList<>();
        list.add("A");
        return list;
    }
}

5.测试调用方式


@Autowired
private StrategyHolder strategyHolder;

@Test
public void testStra() {
    TypeEnum typeEnum = TypeEnum.A;//模拟参数
    //TypeEnum typeEnum = TypeEnum.B;//模拟参数
    
    //通过typeEnum可获取到具体的实现类的Bean
    IStrategy strategy = strategyHolder.getStrategy(typeEnum);
    //执行对应的方法
    List<?> b = strategy.doSomething("随意", typeEnum);
    System.out.println(b);
}