0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

设计模式-策略模式

京东云 来源:京东工业 孙磊 作者:京东工业 孙磊 2025-01-08 13:47 次阅读

作者:京东工业 孙磊

一、概念

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

二、实际应用

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

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

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

多个实现类

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

    @Override    
    public boolean execute(GatherDataVo gatherDataVo) {  

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

     }
}

使用枚举存储策略实现bean

@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;    
    }
}

使用到不同策略的代码

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

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4802

    浏览量

    68741
收藏 人收藏

    评论

    相关推荐

    一文详解前端常用设计模式

    设计模式一直是程序员谈论的“高端”话题之一,总有一种敬而远之的心态。在了解后才知道在将函数作为一等对象的语言中,有许多需要利用对象多态性的设计模式,比如单例模式策略
    的头像 发表于 11-30 10:19 1628次阅读
    一文详解前端常用设计<b class='flag-5'>模式</b>

    关于LVOOP设计模式的框架问题?

    1. 请问目前的很多设计模式,比如简单工厂模式策略模式之类的,labview是不是没有框架,需要自己手工去实现?2. labview的actor framework是不是目前labv
    发表于 08-07 23:14

    基于交错反激的微型逆变器不同工作模式控制策略的仿真研究

    基于交错反激的微型逆变器不同工作模式控制策略的仿真研究_胡林静
    发表于 12-15 18:02 4次下载

    混合导通模式BoostPFC的控制策略研究

    混合导通模式BoostPFC的控制策略研究_王武
    发表于 01-04 16:32 8次下载

    封装变化与面向接口编程

    在使用Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,这其实就是策略模式的应用。策略
    发表于 11-28 15:04 7364次阅读
    封装变化与面向接口编程

    不会有人不知道怎么优雅的替换if-else语句吧

    三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 融入策略模式策略模式+工厂+单例模式,锦上添花; 接
    的头像 发表于 07-28 15:46 1445次阅读
    不会有人不知道怎么优雅的替换if-else语句吧

    设计模式最佳实践探索—策略模式

    根据不同的应用场景与意图,设计模式主要分为创建型模式、结构型模式和行为型模式三类。本文主要探索行为型模式中的
    的头像 发表于 10-31 14:24 960次阅读

    为什么我不再推荐枚举策略模式

    我们可以看到经典方法,创建了一个接口、三个策略类,还是比较啰嗦的。调用类的实现也待商榷,新增一个策略类还要修改榜单实例(可以用抽象工厂解决,但是复杂度又上升了)。加之我们有更好的选择,所以此处不再推荐经典策略
    的头像 发表于 04-14 10:52 2060次阅读

    基于输入阻抗控制的多模式混合PFC的控制策略

    简单地说,混合PFC的控制策略就是操纵开关频率在正弦电压内进行变化来进行跨越多个区域,难点是多模式区域的增益不会统一,实现多模式优秀的电流控制效果就是难题
    的头像 发表于 04-25 14:20 1370次阅读
    基于输入阻抗控制的多<b class='flag-5'>模式</b>混合PFC的控制<b class='flag-5'>策略</b>

    高频使用的几种设计模式

    策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的的客户。这个策略模式的定义是不是有点抽象呢?那
    的头像 发表于 05-08 09:57 1042次阅读
    高频使用的几种设计<b class='flag-5'>模式</b>

    设计模式行为型:策略模式

    策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式
    的头像 发表于 06-07 11:18 674次阅读
    设计<b class='flag-5'>模式</b>行为型:<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    迭代模式在UVM中的应用有哪些

    行为型设计模式数量较多,上一篇介绍了模板模式策略模式,下面对迭代模式进行介绍,挖掘其在UVM中的应用。
    的头像 发表于 08-14 17:15 628次阅读
    迭代<b class='flag-5'>模式</b>在UVM中的应用有哪些

    什么是策略模式

    什么是策略模式 官话: 策略模式(Strategy Pattern): 定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略
    的头像 发表于 10-08 14:15 2744次阅读
    什么是<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    如何通过策略模式简化if-else

    相信大家日常开发中会经常写各种分支判断语句,比如 if-else ,当分支较多时,代码看着会比较臃肿,那么如何优化呢? 1、什么是策略模式? Define a family
    的头像 发表于 10-08 16:08 784次阅读
    如何通过<b class='flag-5'>策略</b><b class='flag-5'>模式</b>简化if-else

    Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计

    中,通常会使用枚举来定义业务上的一组常量,那除了简单地定义常量之外,我们如何利用枚举来实现高内聚、低耦合的设计呢?下面介绍下枚举和策略模式、函数式接口的组合应用。 二、枚举+策略模式
    的头像 发表于 11-21 14:06 243次阅读