基于SpringBoot实现策略模式提供系统接口扩展能力
相信我们对策略模式都有耳闻,但是可能不知道它在项目中具体能有什么作用,我们需要在什么场景下才能去尽可能得去使用策略模式。
这里我简单的列出一个我之前在公司做的一个需求:跟第三方oa系统对接接口,对方需要回调我们当前系统,但是是不同的业务接口回调,我们系统可以根据一个字段来区分需要走哪个业务分支,可能初级程序员刚接触这个需求的时候想法是,多个接口回调,那就写多个接口罢了,强调接口隔离;或者直接一个接口也行,if...else if
也很不错,这里呢,为了彰显我们开发人员的逼格,我们可以基于一个接口外加设计模式之策略模式+简单工厂模式。 下面是一个简单的实现demo:
首先是我们定义一个接口即起路由作用,我们具体的不同业务实现类来实现这个接口就可以;
public interface CalculationStrategy {/*** 策略接口*/int operate(int num1, int num2);
}
@Component("add")
class AddCalculationStrategyImpl implements CalculationStrategy {@Overridepublic int operate(int num1, int num2) {return num1 + num2;}
}
@Component("Division")
class DivisionStrategyImpl implements CalculationStrategy {@Overridepublic int operate(int num1, int num2) {return num1 / num2;}
}
@Component("multiple")
class MultiplicationStrategyImpl implements CalculationStrategy {@Overridepublic int operate(int num1, int num2) {return num1 * num2;}
}
@Component("subtract")
class SubtractionStrategyImpl implements CalculationStrategy {@Overridepublic int operate(int num1, int num2) {return num1 - num2;}
}/*** 如果Component注解中不写标识会默认加载驼峰类名:testStrategyImpl*/
@Component
class TestStrategyImpl implements CalculationStrategy {@Overridepublic int operate(int num1, int num2) {return num1 - num2;}
}
不同的业务分支我就使用加减乘除来代替,也能起到同样的效果。
第二步便是我们的策略上下文,我将其理解为策略工厂,这也是最核心的一个类;这里我们项目启动的时候,第一步是初始化所有加了@component等类,我们的策略工厂的构造函数中有获取所有实现了路由规则的实现类名称,第二步便是将获取到的实现类名称放入到我们初始化的一个空的map中
@Component
public class CalculationFactory{/*** 把策略角色(类型)key,和参数value放到Map中* key就是beanName(具体策略实现类中@Component的名字),value就是接口(具体的实现类)* Maps是guava下的封装类型,实则是静态的创建了一个HashMap的对象,Maps可以根据key去获取value对象*/public final Map<String, CalculationStrategy> calculationStrategyMap = Maps.newHashMapWithExpectedSize(4);/*** 利用构造函数在项目启动的时候将策略实现类注册到 map里* @param strategyMap*/public CalculationFactory(Map<String, CalculationStrategy> strategyMap) {this.calculationStrategyMap.clear();this.calculationStrategyMap.putAll(strategyMap);}//可以使用@Getter注解代替,这样写方便读者理解在Service层调用Context执行策略public Map<String, CalculationStrategy> getCalculationStrategyMap() {return calculationStrategyMap;}
}
第三步便是我们的路由接口实现,这一步便是具体路由的规则判断了 这里有一步我们需要对代码进行健壮性判断,以防map.get()
结果为空导致系统报错,这里大家可以根据业务情况自行去处理。
@Service
public class CalculationService {@Autowiredprivate CalculationFactory calculationFactory;public int operateByStrategy(String strategy, int num1, int num2) {// 获取入参,根据不同的参数类型去执行不同的策略,Context的get方法是在这个地方用到的,operate方法就是一开始定义的策略接口//calculationFactory.getCalculationStrategyMap().get(strategy)这里可能会出现空,所以要做一个容错处理return calculationFactory.getCalculationStrategyMap().get(strategy).operate(num1, num2);}
}
最后便是我们的测试接口了
@RestController
@RequestMapping("/strategy")
public class TestStrategyController {@Autowiredprivate CalculationService calculationService;@GetMapping("/test/{operation}/{num1}/{num2}")public int testCalculation(@PathVariable String operation,@PathVariable int num1, @PathVariable int num2) {// 省略参数判空return calculationService.operateByStrategy(operation, num1, num2);}
}
这样写的好处就是,如果系统还需要扩展其他业务类型的分支处理,那我们只需要将业务处理的实现类实现我们的路由接口,将这个实现类注册进去即可,其他地方都不用改,只需关注我们这个自身的业务分支的逻辑处理。方便了我们系统的后续扩展。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
相关文章:
基于SpringBoot实现策略模式提供系统接口扩展能力
相信我们对策略模式都有耳闻,但是可能不知道它在项目中具体能有什么作用,我们需要在什么场景下才能去尽可能得去使用策略模式。 这里我简单的列出一个我之前在公司做的一个需求:跟第三方oa系统对接接口,对方需要回调我们当前系统…...

v43-47.problems
1.for循环 一般地,三步走: for(初始化;表达式判断;递增/递减) { ....... } 但是,如果说声明了全局变量,那么第一步初始化阶段可以省略但是要写分号‘ ; ’…...
华为HCIP Datacom H12-831 卷14
多选题 1、以下哪些Community属性可以保证BGP路由条目的传播范围只在AS内? A No_Export B No_Export_Subconfed C Interne D No_Advertise 正确答案 A,B 解析:Internet:缺省情况下,所有的路由都属于internet团体。具有此属性的路由可以被通告给所有的BGP对等体。n…...
《vtk9 book》 官方web版 第3章 - 计算机图形基础 (1 / 6)
计算机图形是数据可视化的基础。从实际角度来看,可视化是将数据转换为一组图形基元的过程。然后使用计算机图形的方法将这些基元转换为图片或动画。本章讨论了基本的计算机图形原理。我们首先描述了光线和物体如何相互作用形成我们所看到的景象。接下来,…...
负载均衡是什么,负载均衡有什么作用
一、什么是负载均衡 负载均衡是一种在计算机网络和系统架构中使用的技术,用于均衡分发工作负载到多个资源,比如:服务器、计算节点或存储设备上,以提高系统的性能、可伸缩性。 在传统的单个服务器架构中,当请求量增加…...
Leetcode 3020. Find the Maximum Number of Elements in Subset
Leetcode 3020. Find the Maximum Number of Elements in Subset 1. 解题思路2. 代码实现 题目链接:3020. Find the Maximum Number of Elements in Subset 1. 解题思路 这一题我做的是比较水的,首先就是统计下array当中各个元素出现的频次࿰…...

【Vue2 + ElementUI】更改el-select的自带的下拉图标为倒三角,并设置相关文字颜色和大小
效果图 实现 <template><div class"search_resources"><div class"search-content"><el-select class"search-select" v-model"query.channel" placeholder"请选择" change"handleResource&q…...

TensorFlow2实战-系列教程5:猫狗识别任务数据增强实例
🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、猫狗识别任务 import os import warnings warnings.filterwarnings("ignore&…...

Unity中URP下额外灯角度衰减
文章目录 前言一、额外灯中聚光灯的角度衰减二、AngleAttenuation函数的传入参数1、参数:spotDirection.xyz2、_AdditionalLightsSpotDir3、参数:lightDirection4、参数:distanceAndSpotAttenuation.zw5、_AdditionalLightsAttenuation 三、A…...

BKP备份寄存器、RTC实时时钟
目录 1. BKP (Backup Registers)备份寄存器 2. RTC (Real Time Clock)实时时钟 1. BKP (Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据。当VDD (2.0-3.6V)电源被切断,他们仍然由VBAT (1.8-3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或…...

k8s 进阶实战笔记 | Scheduler 调度策略总结
文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…...

微服务-微服务Spring-cloud-open-feign
1. LoadBalancerRestTemplate的缺陷 LoadBalancerRestTemplate进行微服务调用 BeanLoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}//调用方式String url "http://mall-order/order/findOrderByUserId/"id;R result restTemplate.…...

分类预测 | Matlab实现DT决策树多特征分类预测
分类预测 | Matlab实现DT决策树多特征分类预测 目录 分类预测 | Matlab实现DT决策树多特征分类预测分类效果基本描述程序设计参考资料分类效果...

随机点名--好玩哦
大屏滚动,随机点名,可刺激哦 想屏幕名字滚动得快一点,sleep时间就小一点 效果图 代码 #!/bin/bash namefile"/opt/name.txt" linenum$(sed -n $ $namefile) while : docleartmp$(sed -n "$[RANDOM%linenum1]p" $namefi…...

Linux下的进程操作
进程概念 ps -elf:查看操作系统的所有进程(Linux命令) ctrl z:把进程切换到后台 crtl c:结束进程 fg:把进程切换到前台 获取进程进程号和父进程号 函数原型: pid_t getpid(void); //pid_t…...

uniapp scroll-view用法[下拉刷新,触底事件等等...](4)
前言:可滚动视图区域。用于区域滚动 话不多说 直接上官网属性 官网示例 讲一下常用的几个 scroll 滚动时触发 scrolltoupper 滚动到顶部或左边,会触发 scrolltoupper 事件 scrolltolower 滚动到底部或右边,会触发 scrolltolower 事件 1.纵向滚动…...

聊聊大模型 RAG 探索之路的血泪史,一周出Demo,半年用不好
大家好,今天我们来继续看看 RAG 落地的一些有趣的事儿,从技术社群早上的讨论开始,喜欢技术交流的可以文末加入我们 一、从一周出Demo、半年用不好说起 最近读了读2024-傅盛开年AI大课,其中有讲到RAG环节,三张片子比较…...
UniApp 生命周期详解
UniApp 是一个使用 Vue.js 开发所有前端应用的框架,它可以编译到 iOS、Android、H5、小程序等多个平台。在 UniApp 中,生命周期是指应用或页面从创建到销毁的过程中所经历的一系列阶段。了解生命周期可以帮助开发者更好地管理资源、优化性能和提升用户体…...

用大模型训练实体机器人,谷歌推出机器人代理模型
谷歌DeepMind的研究人员推出了一款,通过视觉语言模型进行场景理解,并使用大语言模型来发出指令控制实体机器人的模型——AutoRT AutoRT可有效地推理自主权和安全性,并扩大实体机器人学习的数据收集规模。在实验中,AutoRT指导超过…...

HCIA-HarmonyOS设备开发认证-2.设备开发入门
目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...