设计模式-策略模式

360影视 2025-01-08 13:22 3

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

策略模式(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); }

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

来源:京东云开发者

相关推荐