策略模式

介绍

当if-else或switch分支太多时,阿里规范要使用策略模式

定义一个算法接口,多个实现算法的具体类,将每个算法都封装起来,并且使它们之间可以互换。UML结构图如下:
在这里插入图片描述
Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算法的公共接口;ConcreteStrategy是具体策略类,封装了具体的算法或行为,继承于Strategy。

举例

根据mq消息类型,分别处理

策略接口

public interface ConsumeStrategy {
    /**
     * 消费消息
     * @author lipo
     * @date 2019-10-15 17:17
     * @param
     * @return
     **/
    String consume(String msg);
}

策略实现类
标签处理

@StrategyType(MqTypeEnum.LABEL)
public class LabelConsumeStrategyImpl implements ConsumeStrategy {
    /**
     * @desc 消费标签消息
     * @author lipo
     * @date 2019-10-15 17:19
     * @param
     * @return
     **/
    @Override
    public String consume(String msg) {
        System.out.println(msg + ", 标签添加成功");
        return "ok";
    }
}

订单处理

@StrategyType(MqTypeEnum.ORDER)
public class OrderConsumeStrategyImpl implements ConsumeStrategy {
    /**
     * @desc 消费标签消息
     * @author lipo
     * @date 2019-10-15 17:19
     * @param
     * @return
     **/
    @Override
    public String consume(String msg) {
        System.out.println(msg + ", 订单添加成功");
        return "ok";
    }
}

上下文切换

@Component
public class ConsumeStrategyBuilder {

    /**
     * 转发map
     */
    private static Map<MqTypeEnum, ConsumeStrategy> map = new ConcurrentHashMap<>();

    //初始化转发map
    static {
        initDispatchMap();

    }

    /**
     * 转发消费消息
     * @param mqTypeEnum
     * @param msg
     * @return
     */
    public String consume(MqTypeEnum mqTypeEnum, String msg) {
        ConsumeStrategy consumeStrategy = map.get(mqTypeEnum);
        return consumeStrategy.consume(msg);
    }

    /**
     * 解析所有策略实现类,装载进入map中
     */
    private static void initDispatchMap() {
        List<String> list = PackageUtil.resolveAllClass(ConsumeStrategyBuilder.class.getPackage().getName() + ".impl");
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

        if (!CollectionUtils.isEmpty(list)) {
            for (String classFullName :
                    list) {
                try {
                    Class<?> aClass = classLoader.loadClass(classFullName);
                    StrategyType annotation = aClass.getAnnotation(StrategyType.class);

                    Object o = aClass.newInstance();
                    if (o instanceof ConsumeStrategy && annotation != null) {
                        map.put(annotation.value(), (ConsumeStrategy)o);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    }

}

测试

@RestController
@RequestMapping("design")
public class DesignController {

    @Autowired
    private ConsumeStrategyBuilder consumeStrategyBuilder;

    /**
     * http://localhost:8080/design/strategy?code=1&msg=hehe
     * 策略模式
     * @param code
     * @param msg
     * @return
     */
    @GetMapping("strategy")
    public String strategy(Byte code, String msg) {
        MqTypeEnum mqTypeEnum = MqTypeEnum.getEnumByCode(code);
        return consumeStrategyBuilder.consume(mqTypeEnum, msg);
    }

}

项目https://github.com/mingwulipo/design-method.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值