ITPub博客

首页 > 应用开发 > IT综合 > 设计模式-策略模式

设计模式-策略模式

原创 IT综合 作者:京东技术 时间:2025-04-27 11:24:16 0 删除 编辑

作者: 京东工业  孙磊

一、概念

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

策略模式结构图
image.png

二、实际应用

业务场景:业务需要监听多种消息,将接收到的消息更新到同一个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);  }

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70037994/viewspace-3082624/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
我是负责京东云云官网的技术品牌宣传工作

注册时间:2024-04-10

  • 博文量
    785
  • 访问量
    818683