设计模式-策略模式

作者:京东工业 孙磊

一、概念

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

策略模式结构图

二、实际应用

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

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

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

多个实现类

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

    @Override    
    public boolean execute(GatherDataVo gatherDataVo) {  

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

     }
}

使用枚举存储策略实现bean

typescript 复制代码
@Getter
@AllArgsConstructor
public 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;    
    }
}

使用到不同策略的代码

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

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

相关推荐
starzy1990几秒前
Flink 任务调度 Graph 源码深度剖析:从 StreamGraph 到 ExecutionGraph 的三层演进
java·大数据·flink
Eyfcom2 分钟前
〖实战〗快运系统 Oracle 性能优化:从“能用”到“扛住双11”的 Java + Spring Boot 实战
java·oracle·性能优化·快递管理系统
m0_587383007 分钟前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
cheems95277 分钟前
从统一响应到 Swagger:一篇讲清微服务接口文档设计未命名
java·微服务·架构·状态模式
Y38153266211 分钟前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
开开心心就好20 分钟前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
不停喝水20 分钟前
【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码
java·开发语言·前端·ai·容器
鱼宵23 分钟前
Spring AI RAG 问答助手:回答带引用,AI 不再睁眼说瞎话
java·人工智能·spring·springai
rannn_11127 分钟前
项目缓存实战:热点 Key 击穿、缓存穿透与多级缓存架构
java·缓存·架构
用户0942485680338 分钟前
第37章:JVM极端场景调优与生产故障复盘方法论
java·jvm