Java中如何使用策略模式减少 if / else 分支的使用

news2024/11/22 14:58:36

目录

1、策略模式

1.1 、策略模式包含三个角色:

2、需求

2.1 、传统方式

2.2 、策略模式实现

2.2.1 、新建PolicyPatternController.java

2.2.2 、Express.java(实体类)

2.2.3 、定义一个接口:PolicyPatternService.java

2.2.4 、定义3个实现类来实现 PolicyPatternService 接口


1、策略模式

        策略模式是一种设计模式,它允许在运行时动态选择算法的行为。它定义了一系列算法,并将每个算法都封装到了一个独立的类中,这些算法可以相互替换使用。在策略模式中,一个类的行为或算法可以在运行时进行更改,而不必修改它的结构。

1.1 、策略模式包含三个角色:

  1. Context(上下文):持有一个策略对象的引用,并调用策略对象提供的算法。

  2. Strategy(策略):定义所有支持的算法的公共接口,并提供具体的实现。

  3. ConcreteStrategy(具体策略):实现 Strategy 接口,提供具体的算法实现。

      策略模式可以帮助我们避免出现大量的 if-else 语句或 switch 语句,使得代码更加简洁、易于维护和扩展。它广泛应用于需要动态地切换算法的场景,例如排序、搜索等算法。

2、需求

     根据传入不同的类型,从而进行不同的处理

2.1 、传统方式

@Service
public class TesiImpl implements PolicyPatternService {

  

   @Override
   public String sayHello(String type) {
      if ("1".equals(type)) {
         // TODO 具体业务代码
      }
      if ("2".equals(type)) {
         // TODO 具体业务代码
      }
      if ("3".equals(type)) {
         // TODO 具体业务代码
      }
      if ("4".equals(type)) {
         // TODO 具体业务代码
      }
      .................................

      return null;
   }
}

这种写法可读性差,后期不易于维护项目。。。。。。

2.2 、策略模式实现

2.2.1 、新建PolicyPatternController.java

@RestController
@RequestMapping("celue")
@Slf4j
public class PolicyPatternController {

    @Autowired
    private List<PolicyPatternService> policyPatternService;

    @PostMapping("test")
    public Result test(@RequestBody Express expres) {
        PolicyPatternService service = policyPatternService.
                stream().
                filter(l -> l.isCeLueModel(expres.getType())).findFirst().orElse(null);
        String name = service.sayHello();
        return Result.ok(name);
    }
}

2.2.2 、Express.java(实体类)

@Data
public class Express {

   @ApiModelProperty("根据不同的类型实现不同的方法")
   private String type;

}

2.2.3 、定义一个接口:PolicyPatternService.java


public interface PolicyPatternService {

    //判断传入的类型
    Boolean isCeLueModel(String type);
    
    // 方法
    String sayHello();
}

2.2.4 、定义3个实现类来实现 PolicyPatternService 接口

1. JDServcieImpl.java

@Service
public class JDServcieImpl implements PolicyPatternService {
    
    //判断传入的类型
    @Override
    public Boolean isCeLueModel(String type) {
        return Objects.equals(type, "1");
    }

    @Override
    public String sayHello() {
        // TODO 具体业务代码
        return "我是京东";
    }
}

2. YZServcieImpl.java

@Service
public class YZServcieImpl implements PolicyPatternService {

   //传入的类型
   @Override
   public Boolean isCeLueModel(String type) {
      return Objects.equals(type, "2");
   }

   @Override
   public String sayHello() {
      // TODO 具体业务代码
      return "我是邮政";
   }
}

3. ZTServcieImpl.java

@Service
public class ZTServcieImpl implements PolicyPatternService {
 
   //判断传入的类型
   @Override
   public Boolean isCeLueModel(String type) {
      return Objects.equals(type, "3");
   }

   @Override
   public String sayHello() {
      // TODO 具体业务代码
      return "我是中通";
   }
}

4. 测试效果 type = 1

5. 测试效果 type = 2

6. 测试效果 type = 3

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

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

相关文章

Python根据经纬度在地图上显示(folium)

Python根据经纬度在地图上显示&#xff08;folium&#xff09; 一、folium介绍1.folium.Map参数简要介绍2.folium.Marker参数介绍 二、Python根据经纬度在地图上显示&#xff08;示例&#xff09;1.经纬度坐标标记2.经纬度坐标分组标记 一、folium介绍 1.folium.Map参数简要介…

URLConnection(五)

文章目录 1. 断开与服务器的连接2. 处理服务器响应3. 错误条件4. 重定向5. 代理6. 流模式 1. 断开与服务器的连接 HTTP1.1 支持持久连接&#xff0c;允许通过一个TCP socket发送多个请求和响应。不过使用Keep-Alive时&#xff0c;服务器不会因为已经向客户端发送了最后一个字节…

chatgpt赋能python:使用Python操作股票软件:探索股票市场的新方式

使用Python操作股票软件&#xff1a;探索股票市场的新方式 在当今股票市场中&#xff0c;许多投资者正在寻找新的方式来更好地管理其投资组合。一种新的方式是使用Python编程语言操作股票软件。Python拥有简洁的语法和丰富的库来帮助投资者更好地理解和管理股票。在本文中&…

挂耳式耳机哪个牌子好?这次推荐准没错!

在校园里&#xff0c;上网课、复习考证、刷视频……耳机总是我的第一选择&#xff0c;既不会打扰别人又能有效学习&#xff0c;普通的入耳式耳机戴久了总是会耳道痛&#xff0c;甚至出现耳道发炎问题&#xff0c;耳机也总是很难清洁。但是生活中我又离不开耳机&#xff0c;所以…

【源码解析】分库分表框架 Shardingsphere 源码解析

前言 以前研究过如何使用ShardingJdbc&#xff0c;使用ShardingJdbc进行分库分表&#xff0c;但是原理方面没有细致的深入了解。如果仅仅了解如何使用的话&#xff0c;对于改造和排查问题&#xff0c;其实都是不够的&#xff0c;所以跟踪源码了解其运行原理是很重要的。 Demo…

GPT学习笔记-Embedding的降维与2D,3D可视化

嵌入&#xff08;Embedding&#xff09;在机器学习和自然语言处理中是一种表示离散变量&#xff08;如单词、句子或整个文档&#xff09;的方式&#xff0c;通常是作为高维向量或者矩阵。嵌入的目标是捕捉到输入数据中的语义信息&#xff0c;使得语义相近的元素在嵌入空间中的距…

STM32+UART串口+DMA收发

目录 1、cubemax端配置 1.1 初始化配置 1.2 GPIO配置 1.3 UART配置 1.3.1 串口基础配置 1.3.2 DMA配置 2、keil端代码设计 2.1 初始化配置 2.2 DMA接收初始化配置 2.3 DMA发送配置 2.4 接收回调函数设置 2.5 回调函数内容代码编写 2.5.1 接收回调函数 2.5.2 发送回调…

最优化理论-最速下降法的推导与应用

目录 1. 引言 2. 最速下降法的基本原理 3. 最速下降法的推导过程 3.1 梯度和梯度下降 3.2 最速下降法的数学表述 4. 最速下降法的应用 4.1 无约束优化问题 4.2 约束优化问题 5. 最速下降法的优缺点 6. 结论 7.代码实现 1. 引言 在最优化理论中&#xff0c;最速下降法…

3W字吃透:微服务网关SpringCloud gateway底层原理和实操

40岁老架构师尼恩的掏心窝&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生 右手大数据 SpringCloud Alibaba 微服务“三大绝活&#xff0c;拿…

Dock的安装和使用

1、docker基础 三大组件: 仓库、镜像、容器什么是docker: 通俗来讲就是提供服务的容器Docker 两个概念:容器:可以看做空间 例如:磁盘、文件夹 镜像:灵魂 例如:系统、应用 一个镜像可以放在多个容器中(就如同把同一个文件复制到多个磁盘或文件夹一样) 一个容器可以放多个镜…

【Nginx】实战应用(服务器端集群搭建、下载站点、用户认证模块)

文章目录 Nginx实现服务器端集群搭建Nginx与Tomcat部署环境准备(Tomcat)环境准备(Nginx) Nginx实现动静分离需求分析动静分离实现步骤 Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedVRRP环境搭建Keepalived配置文件介绍访问测试keepalived之vrrp_script Nginx制作下载…

python中的常见运算符

文章目录 算数运算符赋值运算关系运算符逻辑运算符非布尔值的与或非运算条件运算符(也叫三元运算符)运算符的优先级 算数运算符 加法运算符&#xff08;如果两个字符串之间进行加法运算&#xff0c;则会进行拼串操作&#xff09; - 减法运算符 * 乘法运算符&#xff08;如果将字…

小鹏汽车Q1财报:押注G6、大力降本,明年智驾BOM降半

‍作者 | 德新编辑 | 王博 小鹏汽车本周发了Q1财报&#xff0c;数据不好看&#xff0c;以致于在微博端也发了公开信。 那后续呢&#xff1f; 小鹏第二季度指引是&#xff0c;总交付数量约为2.1 - 2.2万辆&#xff0c;收入预计约为45 - 47亿元&#xff1b;四季度&#xff0c…

Selective Kernel Networks论文总结和代码实现

论文&#xff1a;https://arxiv.org/abs/1903.06586?contextcs 中文版&#xff1a;(CVPR-2019)选择性的内核网络_sk卷积 源码&#xff1a;GitHub - implus/SKNet: Code for our CVPR 2019 paper: Selective Kernel Networks 目录 一、论文出发点 二、论文主要工作 三、SK模…

洛谷——树

洛谷——树 文章目录 洛谷——树树的重心会议题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据范围 思路 树的直径【XR-3】核心城市题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOI2003] 逃学的小孩题目描述输入格式输出格式样例 #1样例…

Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码

Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码 最近在学习Cocos Creator&#xff0c;作为新手&#xff0c;刚刚开始学习Cocos Creator&#xff0c;上线了两个微信小游戏&#xff0c;刚刚入门&#xff0c;这里记录一下《滑雪趣挑战》实现及上线过程的过程。 ](https://…

vue实现深拷贝的方法

在 vue中&#xff0c;深拷贝是一个很有用的功能&#xff0c;在不改变原来对象状态的情况下&#xff0c;进行对象的复制。 但要实现深拷贝&#xff0c;需要两个对象具有相同的属性。如果两个对象不同&#xff0c;深拷贝也不能实现。 1.我们将变量A的属性赋给变量B&#xff0c;但…

springboot+java医院门诊挂号系统设计与实现ssm008

本课题的目标是使医院门诊信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模块的优化组合实现不同的管理细节&#xff0c;使管理过程实现最大程度的自动化与信息化,并能自动对人工操作环节进行复查,使医院门诊挂号系统出错率降至最低。 主…

3、mqtt客户端演示(MQTT通信协议(mosquitto)发布订阅 C语言实现)

可订阅可发布模式 具体代码 客户端1代码&#xff1a;pub.c #include <stdio.h> #include <stdlib.h> #include <mosquitto.h> #include <string.h>#define HOST "localhost" #define PORT 1883 #define KEEP_ALIVE 60 #define MSG_MAX_S…

ChatGPT提示词工程进阶教学

ChatGPT提示词工程 1 两种大型语言模型LLM1.1 基础大模型&#xff08;base LLM&#xff09;1.2 指令调优大模型(Instruction Tuned LLM) 2 如何更清晰、具体地书写提示词2.1 在提示词中使用“定界符”2.2 向模型请求结构化的输出2.3 要求模型检查任务条件是否满足2.4 输入多范例…