浅谈策略模式的使用

浅谈Spring框架应用的设计模式(六)——策略模式 Spring是目前Java企业级开发应用广泛的框架之一,其具有强大的生态,且得益于其提供的高扩展能力,能够减少开发成本,提高开发效率。如此优秀的框架,当然离不开各种设计模式,本文主要介绍设计模式中的策略模式在Spring框架中的应用。... 阅读详情

1.写在前面

前段时间,和同事共同开发一个关于保险继续率的需求。简单来讲,就是根据数据库中的保单数据从省、公司、产品、人等不同维度计算继续率数据并落库。需求并不复杂,实现一开始想的就是定时任务去跑数,然后去根据不同维度做一个标识,去计算不同的数据,插入数据库。

当然,首当其冲想到的是策略模式。毕竟if else 或者是 switch 都感觉太冗余,而且并不好扩展。

2.代码实现

首先定义策略接口类

public interface Strategy {

    /**
     * 判断当前执行策略的具体实现类
     *
     * @return
     */
    String getName();

    /**
     * 执行策略
     */
    void excutor();
}

实现类A 、 B

@Service
public class StrategyA implements Strategy {
    @Override
    public String getName() {
        return "strategyA";
    }
    @Override
    public void excutor() {
        System.out.println("strategyA");
    }
}


@Service
public class StrategyB implements Strategy {

    @Override
    public String getName() {
        return "strategyB";
    }

    @Override
    public void excutor() {
        System.out.println("strategyB");
    }
}

这样在想要去调用策略的地方去通过注入map,然后直接去get使用就可以

// 注入
@Autowired
private Map<String,Strategy> strategyMap ;


......

// 使用
public void cusumer(Map<String,String> params){
    // 省略校验和其他逻辑代码 ... 
    Strategy stg = strategyMap.get(params.get("flag"));
    if(null != stg){
        stg.execute();
    }
}

这样虽然可以实现在实际调用的时候选到合适的策略类,但是只要是需要使用策略的时候,都需要注入这个map,显得比较麻烦,于是进行了改进。

@Component
public class StrategyMap {
    public static Map<String, Strategy> MAP = new HashMap<>();

    /**
     * 可以通过这种对静态属性进行赋值
     *
     * @param list
     */
    @Autowired
    public void setPartnerService(List<Strategy> list) {
        list.forEach(item -> MAP.put(item.getName(), item));
    }

这样调用方可以直接通过

StrategyMap.MAP.get("strategyB").execute();
// 需要注意npe

去实现调用。

当然,我们可以将调用逻辑进行封装,让StrategyMap去承担调用,这样就不需要处处都去处理npe问题,代码如下

// StrategyMap 中增加方法

/**
 * 执行
 *
 * @param name
 */

public static void excutor(String name) {
    Optional.ofNullable(MAP.get(name)).ifPresent(item -> item.excutor());
}

......

// 调用端
StrategyMap.excutor("strategyB");

最后引入责任链模式:

// StrategyMap 中增加属性LIST
public static final List<Strategy> LIST = new ArrayList();
/**
 * 责任链模式
 *
 * @param name
 */
public static void excutor2(String name) {
    LIST.stream().filter(item -> item.getName().equals(name)).findFirst().get().excutor();
}

......

// 调用端
StrategyMap.excutor2("strategyB");
【3】Ubuntu18.04下载与安装,以及中文输入法的安装 Ubuntu18.04下载与安装一、下载二、安装(在VMware 16 pro中安装Ubuntu18.04)三、Ubuntu中安装中文输入法1.检查 fcitx 框架2.安装输入法 一、下载 下载地址:Ubuntu Releases 往下拉,找到自己需要的安装版本(建议不要安装最新版,因为你在使用时候遇到的错误大多都是以前版本的,最新版本的,解决方案特别少) 我这里安装的是Ubuntu18.04 一般都是使用desktop版本的(desktop版和server版本的区别:请看这篇文章) 之后点击下载即 阅读详情

相关推荐

(Touch™)搭建 Windows 开发环境

> OpenHaptics 开发包参考文档。

置心一处,便无事不办 1500

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

Java设计模式:行为型模式→策略模式 详解

专注分享技术、实用优质教程、资源 1059

Android开发必备:TBS腾讯浏览服务静态集成完整指南(附Demo下载)

本文详细解析了Android开发中TBS腾讯浏览服务的静态集成方案,通过对比动态集成,深入剖析了其核心原理与适用场景。文章提供了从环境准备、资源获取、项目配置到代码初始化的完整指南,并重点介绍了WebView与文件预览等高级特性的实战应用。针对集成过程中的常见问题,提供了详尽的排查清单与性能调优建议,旨在帮助开发者构建极致稳定、不依赖网络的WebView与文件预览功能。文末附有经过验证的Demo项目可供下载参考。

earth的博客 366

浅谈设计模式之策略模式

浅谈设计模式之策略模式 什么是策略模式 策略模式是指针对同一个行为定义不同的算法(或者操作),而且这些算法都可以相互替换,对于使用者来说可以不关心具体的算法实现,让算法独立于使用它的客户。 举例实现 需求 假如我们有一个会员系统系统,同一间商品不同的会员等级有不同的会员折扣,比如: 钻石会员:8折 铂金会员:8.5折 黄金会员:9折 白银会员:9.5折 普通会员:不打折 类图 代码实现 具体商品iphone类: public class Iphone { private BigDecimal

jiangzhou556的博客 213

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 749

浅谈设计模式 之 策略模式(Strategy)

浅谈设计模式 之 策略模式(Strategy) :第一章 浅谈设计模式 之 策略模式(Strategy) 文章目录浅谈设计模式 之 策略模式(Strategy)前言一、策略模式的定义一、策略模式所解决的问题一、策略模式场景示例一、策略模式所遵循的设计原则一、总结 前言 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了减少冗余代码,提高代码的重用性,并且使对象之间的交互更加的松耦合,便于程序的无侵入扩展,从而保证代码的可靠性,比如

Nirvana_lss的博客 918

安防相机宽动态(WDR)技术解析:从原理到实战应用

本文深入解析安防相机宽动态(WDR)技术原理,对比多次曝光与DOL-WDR等实现方式,并区分硬件WDR与数字WDR(DWDR)的本质差异。文章重点阐述了WDR在逆光出入口、夜间道路监控等五大典型场景的实战应用与调参技巧,旨在帮助用户根据实际需求正确选择与配置,确保监控系统在复杂光线下清晰成像。

weixin_29191081的博客 427

设计模式之策略模式浅谈

设计模式之 策略模式浅谈 -定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 Context叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 举个栗子: 一天经理看到小王写了一段要上线测试的代码: public int calculate(int numOne,int numTwo,String t

weixin_43456047的博客 157

sam3.1 部署笔记 推理封装

sam3.1 部署笔记

jacke121的专栏 422

第14.7章 高翔博士最新开源框架Lightning-LM源码解读(七):PoseExtrapolator模块深度剖析,揭秘激光SLAM高频位姿外推核心技术

PoseExtrapolator是Lightning-LM框架中负责高频位姿外推的核心模块,通过融合DR(航位推算)、激光里程计和PGO(位姿图优化)数据实现精准实时定位。模块初始化依赖PGO数据,后续通过DR数据进行高频位姿更新,并利用PGO结果进行误差补偿。关键函数AddDRLocAndExtrapolate处理DR增量位姿,结合速度补偿机制逐步修正误差,保证高频输出的同时提升精度。该模块体现了多传感器融合思想,通过互补性数据(高频DR与低频高精PGO)实现鲁棒定位,代码中使用了SE3位姿表示、互斥锁保

行知SLAM 348

浅谈策略模式

对策略模式的一点愚见 在项目恰当的使用策略模式,可以使代码简洁明了,提高扩展性。最常见的使用场景在有多层if-else的逻辑判断中。通过策略模式的替换,让代码更优雅。 一.个简单的例子 这样的写法虽然简单,但也带来了一些问题 1.如果每个分支的业务逻辑比较复杂,就会导致当前方法非常的臃肿 2.给其他开发人员带来了阅读困难(心里吐槽:这谁写的垃圾玩意),提高了维护成本 二.改进措施 策略模式 通过策略模式实现多个用户类型的业务处理 2.1 实现方式 2.1.1.一个抽象的业务接口 2.1.2.具体的业务实现

qq_43138480的博客 206

流体仿真软件:COMSOL Multiphysics二次开发_(3).流体仿真基础理论

流体仿真基础理论包括流体的基本性质、流体运动方程、边界条件、初始条件、湍流模型和网格生成等。在使用COMSOL Multiphysics进行流体仿真时,正确设置这些参数和条件是获得准确仿真结果的关键。通过实际应用案例,可以更好地理解如何在COMSOL中进行流体仿真,并提取和分析仿真结果。希望本文对流体仿真初学者和从业人员有所帮助。

kkchenjj的博客 1341

浅谈策略模式在消息转发场景下的应用

背景在上一篇文章中,我们介绍了如何设计一个消息中心,传送门 ????《如何设计一个消息中心》有了承载这些消息的地方后,接下来的问题便是,这些消息从哪里来?通常对于一个内容型产品来说,在其互动体系中,为了增强消息的用户触达,增强用户的互动心智,在互动(评论、点赞等)行为发生后,会将互动消息推送至消息中心,然后根据不同的互动行为类型匹配不同的消息模版。然而随着互动行为种类的增加(内容的点赞、评论的点赞……)...

768

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

浅谈springMVC中的设计模式(3)——策略模式

在springMVC中,我们常常能看到策略模式的身影,其实策略模式在我们日常开发中也是十分常见的设计模式,先来看看它的定义:策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 使用策略模式有时候可以让我们的编码从繁琐难维护的if-else中解放出来。 getDefaultStrategies 例如在DispatchS...

ljw761123096的博客 8594

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

浅谈设计模式-策略模式

Intent 定义一系列算法,封装每个算法,并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 Class Diagram Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。 Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。 与状态模式的比较 ..

学渣的博客 183

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

浅谈模式 - 策略模式

在行为级别。把if else,switch替换掉的最好方式。 策略类型的存放,有些人喜欢用static map,我喜欢用Enum,我感觉更优雅。 Enum作为策略类型,实现类的beanId直接写到Enum中。今后的可扩展点就是新增或者删除实现类,并且对Enum作调整。 这边的Enum就相当于是配置了。 这边举一个简单的案例,比如要去上海旅游,有3中策略:跑去,开车,飞机。来看代码。 public ...

wjlucky262的专栏 226

策略模式浅谈

其实策略模式,从字面意思上理解,类似于我想达到某一种效果时,不用去煞费苦心的再去想方法,而是已经做好的方法只要去调用就可以了那么体现到java程序设计里,也可以这么理解,如果过程是随着参数的变化而变化的,这个时候就可以用策略模式好像有点类似于开车,想要车跑的速度不一样,只需要轻轻的换下档位就O了,每个档位对应的速度范围都是设计好的从下面的这个小小的遍历文件的例子来看效果:现在我想遍历E盘下的abc文

Stan的专栏 629

浅谈Spring自动注入实现策略模式

前几天,导师分配了一个任务,让我优化几个if语句用策略模式的方法。下面介绍两种实现方法: 1.工厂模式+策略模式 2.spring自动注入 方法一: 首先是工厂模式+策略模式的方案,我们先定义一个技能种类的接口 public interface SkillType { //释放技能 void release(); } 创建实现类 public class SkillTypeImpl_1 implements SkillType { @Override pu

weixin_42552851的博客 1040

浅谈JAVA设计模式之策略模式

我们现实开发中,有很多地方需要用到不同的算法或者说不同的处理逻辑去处理相同的需求。比方说支付,支付会有支付宝支付、微信支付以及京东支付等等。再比方说订单折扣,会有现金返现折扣、优惠折扣以及团购折扣等等。每当出现一个新的逻辑,就需要多一个一段if…else…片段处理。策略模式就是为了解决上述这种逻辑分支多的问题。 策略模式的类结构图 首先我们来看一下策略模式的简单处理方式 public cla...

一个苦苦挣扎的JAVA开发 247

浅谈设计模式——策略模式

1、策略模式 **定义:**定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。此模式让算法的变化独立于使用算法的客户。 类图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pyp76E14-1586506012969)(设计模式.assets/image-20200410152738286.png)] 介绍 **意图:**定义一系列的算法,把它们一个个...

weixin_41992670的博客 209

浅谈Java设计模式之策略模式

Java策略模式

program_god的博客 389

如何写出优雅易维护的代码?——浅谈策略模式

最近在工作中偶遇一个看似平平无奇的需求,简单概括就是改造项目里之前做的PDF导出模板和数据,这里需要根据不同状态导出不同的模板数据。接到需求那一刻,脑海里瞬间就有了解决方案,只需要简单修改一下模板,然后修改查询回填数据就可以了嘛 so easy 。当我找到这一块的代码的时候整个人都懵了,因为需要判断两个状态,之前的代码是这样实现的:switch...case... 接着里边再用上祖传的 if...else...判断,注释寥寥几行展示了前人强大的脑回路......

程序猿爱篮球 577

设计模式之策略模式浅谈以及简单例子

设计模式之策略模式 策略模式定义了算法类,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 策略模式是对算法的包装,是把使用的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。 策略模式涉及到三个角色: 环境(Context)角色:...

dgls50457的博客 135
上一篇: mac系统下通过idea使用git指令
下一篇: 关于优化接口或程序响应的总结
桥边红药_
博客等级 码龄5年 40粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值