写点什么

设计模式 - 策略模式

  • 2025-01-08
    北京
  • 本文字数:1263 字

    阅读完需:约 4 分钟

作者:京东工业 孙磊

一、概念

策略模式(Strategy Pattern)也称为(Policy Parttern)。 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变换,不会影响到使用算法的客户。策略模式属性行为模式。


策略模式结构图


二、实际应用

业务场景:业务需要监听多种消息,将接收到的消息更新到同一个 ES 中,不同的消息类型使用不同的策略处理,补充不同的数据信息,更新到 ES 中,供商家搜索和统计使用。


代码实现结合 spring 框架、简单工厂和策略模式一起使用。


public interface GatherExecuteService {        /**         * 处理消息体         *         * @param gatherDataVo         */        boolean execute(GatherDataVo gatherDataVo);}
复制代码


多个实现类


// 价格策略实现@Servicepublic class PriceExecuteServiceImpl implements GatherExecuteService {        @Override        public boolean execute(GatherDataVo gatherDataVo) {         .....具体实现代码省略       }}
复制代码


// 商品策略实现@Servicepublic class ProductExecuteServiceImpl implements GatherExecuteService {  
@Override public boolean execute(GatherDataVo gatherDataVo) {
.....具体实现代码省略 }}
复制代码


// 库存策略实现@Servicepublic class StockExecuteServiceImpl implements GatherExecuteService {        @Override        public boolean execute(GatherDataVo gatherDataVo) {        .....具体实现代码省略  
}}
复制代码


使用枚举存储策略实现 bean


@Getter@AllArgsConstructorpublic enum MessageTypeEnum {        PRODUCT(0, "productExecuteServiceImpl", "商品基本信息消息"),        PRICE(1, "priceExecuteServiceImpl", "价格消息"),        STOCK(2, "stockExecuteServiceImpl", "库存消息") ;        private int type;        private String service;       private String description;        public static String getServiceName(int type) {                MessageTypeEnum[] typeEnums = MessageTypeEnum.values();                for (MessageTypeEnum enumType : typeEnums) {                        if (enumType.getType() == type) {                                return enumType.getService();                        }             }        return null;        }}
复制代码


使用到不同策略的代码


// 根据消息类型获取不同策略类,然后使用spring的ApplicationContext获取bean,达到执行不同策略的目的。String serviceName = MessageTypeEnum.getServiceName(gatherDataVo.getMessageType());if (StringUtils.isNotBlank(serviceName)) {      GatherExecuteService gatherExecuteService = (GatherExecuteService) SpringContextUtil.getBean(serviceName,                      GatherExecuteService.class);  }
复制代码


策略模式是一种比较简单的设计模式,工作中经常和其他设计模式一块使用。简单的应用记录分享一下。

发布于: 刚刚阅读数: 4
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
设计模式-策略模式_京东科技开发者_InfoQ写作社区