Springboot整合策略模式概念->使用场景->优缺点->企业级实战

news2024/11/24 18:40:49

一、前言

策略模式可能是在工作中使用最多的,也是在面试中最常提到的,代码重构和优化的必备!
小编之前也是一直说,其实没有真正的实战;最近有了机会实战了一下,来分享一下使用心得和在企业级的使用!

二、策略模式

1. 什么是策略模式

策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:

定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

2. 策略模式结构组成

  • Strategy:抽象策略类,一般为接口或者策略类
  • ConcreteStrategy:具体算法实现策略类
  • Context:环境或者上下文类,用于统一执行具体策略

其实以上三部分用白话文来解释就是:
需要一个接口和策略进行规范和约束接口和方法,这时需要一些具体的实现算法类去继承或者实现刚刚的接口和策略,最后通过一个环境或者上下文,也可以叫做工厂根据类型进行调用具体的算法!

3. 使用场景

  • 避免冗长的 if-else 或 switch 分支判断
  • 需要动态地在几种算法中选择一种
  • 对客户隐藏具体策略 (算法) 的实现细节,彼此完全独立,扩展其余不受影响

具体场景一般为:

  • 支付方式选择
  • 打折、满减方式选择
  • 根据类型调用不同的系统

4. 优缺点

优点:

  • 扩展性好
  • 符合开闭原则
  • 符合单一职责原则
  • 可读性好
  • 便于维护
  • 避免多层判断

缺点:

  • 策略过多,导致策略类
  • 对新手读代码不友好

三、策略模式实战

1. 实战例子

今天小编根据春夏秋冬四季需要做不同的事情来演示一下策略模式的使用方案;
需求是:
如果是春天,就要去放风筝
如果是夏天,就要去游泳
如果是秋天,就要去看枫叶
如果是冬天,就要去打雪仗
没有使用策略模式的话,肯定就是
if-if else进行实现!
下面就带大家体会一下具体使用哈!!

2. 策略接口

/**
 * 四季策略
 * @author wangzhenjun
 * @date 2022/12/1 9:30
 */
public interface SeasonsStrategy {

    /**
     * 根据季节去执行不同的方案
     * @param seasons
     * @return
     */
    String execute(String seasons);
}

3. 春季具体实现

/**
 * 春季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("spring")
public class SpringStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去放风筝吧!";
    }
}

4. 夏季具体实现

/**
 * 夏季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("summer")
public class SummerStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去游泳吧!";
    }
}

5. 秋季具体实现

/**
 * 秋季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("autumn")
public class AutumnStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去放看枫叶吧!";
    }
}

6. 冬季具体实现

/**
 * 冬季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("winter")
public class WinterStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去打雪仗吧!";
    }
}

7. 上下文工厂实现

private Map<String, SeasonsStrategy> seasonsMap;这是最重要的,很多时候我们都知道怎么进行策略和实现怎么写,不知道怎么统一去放进去,来进行调用,可以自己放在map中。当然spring已经给我们组装好了,只要按需调用即可!

核心:
Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类!

/**
 * 环境或者上下文类,用于统一执行具体策略
 * @author wangzhenjun
 * @date 2022/12/1 9:56
 */
@Component
public class SeasonsFactory {
    /**
     * Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类
     */
    @Autowired
    private Map<String, SeasonsStrategy> seasonsMap;

    /**
     * 处理四季统一入口方法
     * @param seasons
     * @param beanName
     * @return
     */
    public String handle(String seasons,String beanName){
    	// 根据bean的名称获取对应的算法处理类
        SeasonsStrategy seasonsStrategy = seasonsMap.get(beanName);
        String execute = seasonsStrategy.execute(seasons);
        return execute;
    }
}

8. controller处理

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
	
    @Autowired
    private SeasonsFactory seasonsFactory;

    @GetMapping("/strategyTest/{seasons}/{beanName}")
    public Result strategyTest(@PathVariable("seasons") String seasons,@PathVariable("beanName") String beanName){
        String handle = seasonsFactory.handle(seasons, beanName);
        return Result.success(handle);
    }
}

9. 测试

http://localhost:8087/test/strategyTest/春天/spring
在这里插入图片描述
http://localhost:8087/test/strategyTest/夏天/summer
在这里插入图片描述

四、总结

在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换,互不影响。

策略模式得益于按照开闭原则进行设计,各个具体算法按照单一职责原则设计; 提高了代码的复用性,对客户隐藏具体策略 (算法) 的实现细节,彼此完全独立,扩展其余不受影响;避免if-else 或 switch 分支语句判断;其缺点在于客户端必须知道所有的策略类,增加了系统中类的个数。

在日常开发一般用于消除多重判断,有时候不要为了用设计模式而用设计模式,一定要结合业务场景,过度设计也是很致命的!!

如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!


可以看下小编的微信公众号,和网站文章首发看,欢迎关注,一起交流哈!!

点击访问!小编自己的网站,里面也是有很多好的文章哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac装机清理工具CleanMyMac2022最新版功能介绍

从最初开始下载CleanMyMac开始&#xff0c;CMM一直在提供智能的清理&#xff0c;从颇受小白用户喜爱的自动清理特性开始&#xff0c;仅需一键即可快速而安全地清理系统各角落垃圾&#xff0c;释放宝贵硬盘空间&#xff0c;CMM或许可以说是是 Mac上最知名的系统清理工具了。 Cl…

java EE初阶 —— 线程的安全问题

文章目录1.线程安全1.1 代码体现线程的不安全1.2 线程安全问题分析1.3 产生线程安全问题的原因1.4 线程安全问题的解决办法1.5 synchronized 的使用方法1.线程安全 多线程的抢占式执行&#xff0c;带来的随机性是线程安全问题的罪魁祸首&#xff0c;万恶之源。 如果没有多线程…

国内表格软件-FineReport Count函数

1. 概述 1.1 函数作用 计算数组或数据区域中所含项的个数&#xff0c;例如统计「地区数」和「销售员个数」&#xff0c;如下图所示&#xff1a; 也可与其他函数嵌套使用&#xff0c;例如进行「条件计数」&#xff0c;计算除孙林以外的销售员个数&#xff0c;如下图所示&#x…

Lactoferrin-PEG-alginate 乳铁蛋白-聚乙二醇-海藻酸钠

产品名称&#xff1a;乳铁蛋白-聚乙二醇-海藻酸钠 英文名称&#xff1a;Lactoferrin-PEG-alginate 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、…

VBA驱动SAP GUI自动化:查找页面元素FindAllByName

我们在VBA中嵌入SAP原生的【脚本录制与回放】功能生成的VBS脚本&#xff0c;可以实现很多自动化操作。但只有我们对SAP做了一系列动作&#xff0c;才会得到这些动作的脚本。然而&#xff0c;一旦我们需要用代码提前做一些判断&#xff0c;然后再决定后续的动作时&#xff0c;这…

MBR主引导记录

主引导记录&#xff08;Master Boot Record&#xff0c;缩写&#xff1a;MBR&#xff09;&#xff0c;又叫做主引导扇区&#xff0c;是计算机开机后访问硬盘时所必须要读取的首个扇区&#xff0c;它在硬盘上的三维地址为&#xff08;柱面&#xff0c;磁头&#xff0c;扇区&…

基于ARM的环境参数检测系统设计(Labview+STM32+ZigBee)

目 录 1 绪论 1 1.1 研究背景和意义 1 1.2 研究现状 2 1.3 研究内容 3 2 系统概述和相关原理 4 2.1 系统的功能分析与设计 4 2.2 LabVIEW介绍 5 2.3 ZigBee技术 5 2.3.1 ZigBee技术概述 5 2.3.2 ZigBee网络协议 6 2.3.3 ZigBee网络拓扑结构 7 2.4 GSM技术 8 2.5 本章小结 8 3 …

【研发工具】Centos下搭建轻量级内网FTP服务器

1 前言 vsftpd是一款非常小巧、高性能、稳定性好、安全易用的Linuxt环境下的的FTP服务器软件。 vsftpd 名称是取自 very secure FTP daemon 的缩写&#xff0c;可以在类UNIX类操作系统上运行。 2 部署 通常情况下可以在线安装, # centos / Redhat 操作系统下 $ yum -y ins…

【历史上的今天】12 月 1 日:新浪网成立;钉钉上线;古登堡计划发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 12 月 1 日&#xff0c;在 1948 年的今天&#xff0c;中国人民银行成立&#xff0c;并发行了第一套人民币&#xff1b;第一套人民币共印制发行了 12 种面额、6…

推荐系统:架构设计

架构设计概述 架构设计是一个很大的话题&#xff0c;这里只讨论和推荐系统相关的部分。更具体地说&#xff0c;我们主要关注的是算法以及其他相关逻辑在时间和空间上的关系——这样一种逻辑上的架构关系。 在前面的章节中我们讲到了很多种算法&#xff0c;每种算法都是用来解决…

[附源码]JAVA毕业设计个人交友网站(系统+LW)

[附源码]JAVA毕业设计个人交友网站&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

【JavaWeb】Servlet系列 --- 关于一个web站点的欢迎页面

web站点的欢迎页面1. 什么是一个web站点的欢迎页面&#xff1f;2. 怎么访问欢迎页面&#xff1f;静态资源进行变换动态资源3. &#xff08;易错&#xff09;关于WEB-INF目录1. 什么是一个web站点的欢迎页面&#xff1f; 对于一个webapp来说&#xff0c;我们是可以设置它的欢迎…

Java的I/O框架

目录 一、流的概念 二、流的分类 1.按方向 2.按单位&#xff1a; 3.按功能&#xff1a; 三、字节流 1、文件字节流 &#xff08;1&#xff09; FileInputStream&#xff1a; &#xff08;2&#xff09;FileOutputStream&#xff1a; &#xff08;3&#xff09;完成复…

c++基础(自用)

C基础入门 1 C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 1.1.2 创建文件 右键源文件&#xff0c;选择添加->新建项 给C文件起…

Windows8系统下DOSBox编译、链接、执行汇编语言步骤

下载安装好DOSBox后&#xff0c;同时下载debug、link、masm程序。 &#xff08;1&#xff09;建立工作目录&#xff0c;编写汇编语言源文件&#xff0c;并将debug、link、masm程序放在同一目录下。&#xff08;下图中ass.asm是汇编语言源文件&#xff09; &#xff08;2&#x…

2022年第四届大数据与计算国际研讨会(WBDC 2022)

2022年第四届大数据与计算国际研讨会&#xff08;WBDC 2022&#xff09; 重要信息 会议网址&#xff1a;www.iwbdc.org 会议时间&#xff1a;2022年12月16-18日 召开地点&#xff1a;中国北京 截稿时间&#xff1a;2022年10月31日 录用通知&#xff1a;投稿后2周内 收录检…

MPI 快速入门

浅学 MPI。 MPI 分布式内存多处理器&#xff1a; 处理器 辅助组件 > 节点一堆节点 > 高性能计算系统 节点 > 进程 节点之间&#xff1a;消息传递 MPI&#xff1a;消息传递接口 安装 还是用 Docker 方便。 宿主机&#xff1a; sudo docker run -idt --name op…

移动WEB开发之流式布局--移动WEB开发之flex布局--携程网首页案例制作

案例&#xff1a;携程网移动端首页 访问地址&#xff1a;携程旅行-酒店预订,机票预订查询,旅游度假,商旅管理-携程无线官网 (ctrip.com) 1. 技术选型 方案&#xff1a;我们采取单独制作移动页面方案 技术&#xff1a;布局采取flex布局 2. 搭建相关文件夹结构 3. 设置视口标…

三、【react-redux】数据共享

文章目录1、优化项目结构2、添加一个新容器组件2.1、新项目结构2.2、CODE2.2.1、reduc/constant.js2.2.2、redux/actions/person.js2.2.3、redux/reducers/person.js2.2.4、redux/store.js2.2.5、Count.jsx2.2.6、Person.jsx2.3、Result3、总结本示例修改自 上一章 求和Demo 1、…

SVN版本控制软件

尚硅谷SVN版本控制软件教程&#xff08;一套掌握svn操作&#xff09; 学习网址&#xff1a;https://www.bilibili.com/video/BV1mW411M7yR/?spm_id_from333.999.0.0&vd_source461545ff50a35eaeaa8218ecdc5f7152 学习时长&#xff1a;1小时46分钟 未学习 5.启动服务器 6.…