利用策略模式优化if-else

2023-05-16

一、定义

策略模式(Strategy Pattern):策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化.

二、优缺点

优点:

1.策略模式符合开闭原则。

2.可以避免使用多重条件判断。例如(if...else...等)

3.使用策略模式可以提高算法的保密性和安全性。

缺点:

1.使用方必须知道所有的策略,并且自行决定使用哪一个策略。

2.代码中会产生大量的策略类,增加维护难度。

三、代码实现

需求:我们有两个数字,要根据传入的type来判断这两个数字应该是相加,还是相减。

1.首先我们定义一个抽象类,或者接口

public interface CalculateService {

  void calculateValue(Integer number1, Integer number2);

}

2.接下来我们定义策略的工厂.

@Component
public class CalculateServiceFactory {

  @Resource
  private Map<String, CalculateService> calculateServiceStrategyMap = new ConcurrentHashMap<>(5);


  public CalculateService getCalculateServiceImpl(String type) {
    return calculateServiceStrategyMap.get(type);
  }

}

3.我们定义不同的实现类,重点在于bean的名字,bean的名字其实就是我们if...else判断的条件

减法的实现类 

@Slf4j
@Service("subtraction")
public class subtractionCalculateServiceImpl implements CalculateService {


  @Override
  public void calculateValue(Integer number1, Integer number2) {
    Integer result = number1 - number2;
    log.debug("策略模式====>计算类结果为" + result);
  }
}

加法的实现类 

@Service("addition")
@Slf4j
public class AdditionCalculateServiceImpl implements CalculateService {

  @Override
  public void calculateValue(Integer number1, Integer number2) {
    Integer result = number1 + number2;
    log.debug("策略模式====>计算类结果为" + result);
  }
}

4.策略模式与传统的if...else的比较

  public void calculateTraditionalMethod(String type) {
    Integer number1 = 1;
    Integer number2 = 2;

    if (type == "addition") {
      Integer result = number1 + number2;
      System.out.print("传统实现====>计算类结果" + result);
    } else if (type == "subtraction") {
      Integer result = number1 - number2;
      System.out.print("传统实现====>计算类结果" + result);
    }
  }

  @Autowired
  private CalculateServiceFactory calculateServiceFactory;

  
  //这里直接根据传入的type 去找到对应的bean 所以不需要进行判断
  public void calculateStrategyMethod(String type) {
    calculateServiceFactory.getCalculateServiceImpl(type);
  }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用策略模式优化if-else 的相关文章

  • np.max 与 np.maximum

    1 参数 首先比较二者的参数部分 xff1a np max xff1a a axis 61 None out 61 None keepdims 61 False 求序列的最值最少接收一个参数axis xff1a 默认为列向 xff08 也即
  • matlab 中使用 GPU 加速运算

    为了提高大规模数据处理的能力 xff0c matlab 的 GPU 并行计算 xff0c 本质上是在 cuda 的基础上开发的 wrapper xff0c 也就是说 matlab 目前只支持 NVIDIA 的显卡 1 GPU 硬件支持 首先
  • Linux Ubuntu系统设置成中文语言

    1 打开 系统设置 xff1a 可以从右上角弹出菜单 xff0c 选择 System Settings 打开系统设置 也可以点击左侧 xff08 齿轮和扳手 xff09 快捷图标打开 2 首先选择软件更新服务器 xff0c 选择国内的 3
  • VNC 灰屏

    用vnc连接服务器的时候 xff0c 出现了灰屏 xff0c xff08 在xshell可以正常运行 xff09 上面会显示三个checkbox xff1a Accept clipboard from viewers Send clipbo
  • 从零开始学习树莓派4B与ROS历程(1)——安装ubantu系统,ROS以及配置远程SSH(一系列错误解决办法,无显示屏外设也可以安装系列)

    目录 安装ubuntu系统文件 1 使用显示器连接树莓派 2 使用SSH xshell安装 安装ROS 安装ubuntu系统文件 1 下载ubuntu系统文件Ubuntu18版 xff0c 目前最新都是21版本了 xff0c 但是树莓派处理
  • Ubuntu服务器端与客户端(RV1126)配置NFS实现文件夹共享

    这里写目录标题 1 NFS简介2 NFS实现步骤3 测试平台3 NFS安装方法1 xff09 安装 NFS 软件包2 xff09 设置 NFS 共享目录3 xff09 主机启动NFS 4 客户端配置方法1 xff09 连接客户端和服务器2
  • 由xubuntu桌面系统恢复到ubuntu桌面系统

    假定读者原来的系统为ubuntu桌面系统 xff0c 并且根据如下命令更换到xubuntu桌面系统 sudo apt get install xrdp sudo apt get install vnc4server sudo apt get
  • 设置Chrome以https方式访问指定网址

    1 打开Chrome xff0c 在地址栏键入chrome net internals xff0c 回车 2 在HSTS选项卡下的Domain中输入你想要实现这个强制跳转的域名 xff0c 如 twitter com gt https tw
  • winfrom自适应布局技巧

    两个技巧 控件的布局属性 Anchor技巧Dock技巧 FillLeftRightBottomTop 以上方法可能达不到想要的效果 xff0c 可以使用下面的方法 表格布局控件应用 TableLayoutPanel 对控件进行行列编辑 xf
  • x0vncserver

    vncserver By default a logged in user has a desktop provided by X Server on display 0 A user can share their desktop usi
  • k8s安装flannel组件出错

    安装完flannel组建后 xff0c 查看pod xff0c 显示Error 查看log 提示 xff1a Error registering network failed to acquire lease subnet 34 10 24
  • openjdk下载与安装

    openjdk下载与安装 官方网站和文档参考 http openjdk java net install 安装说明 http jdk java net 11 openjdk下载地址
  • DirectUI简介

    DirectUI界面库 取名自微软的一个窗口类名 DirectUIHWND xff0c 意为Paint on parent dc directly 即子窗口不以窗口句柄的形式创建 xff0c 只是逻辑上的窗口 xff0c 绘制在父窗口之上
  • 机器学习 之 Haar特征

    Haar特征 Haar特征原理综述 Haar特征是一种反映图像的灰度变化的 xff0c 像素分模块求差值的一种特征 它分为三类 xff1a 边缘特征 线性特征 中心特征和对角线特征 用黑白两种矩形框组合成特征模板 xff0c 在特征模板内用
  • Linux下将c++转换为so文件并利用python调用

    C 43 43 转so文件 这里以简单的加法为例 xff0c 代码如下 xff0c add传入两个int的参数 xff0c 完成加法 主函数main调用add xff0c return结果 这里需要注意的点在于 xff0c 不能忘记将函数添
  • Oracle的rollup、cube、grouping sets函数

    Oracle的rollup cube grouping sets函数 Oracle的group by除了基本用法以外 xff0c 还有3种扩展用法 xff0c 分别是rollup cube grouping sets 1 rollup 假设
  • 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类 一 无条件跳转 JMP 二 根据 CX ECX 寄存器的值跳转 JCXZ CX 为 0 则跳转 JECXZ ECX 为 0 则跳转 三 根据 EFLAGS 寄存器的标志位跳转 这个太多了 根据标志位跳转的指令 JE 等于则跳
  • 中标麒麟yum源的问题以及 mips64el.rpm和.noarch.rpm 不同 openjdk1.8安装

    1 一开始发现yum源地址不对 xff0c 访问不了 xff0c 进行了修改 ns7 adv os name 61 NeoKylin Linux Advanced Server 7 Os baseurl 61 http download c
  • 多任务学习(Multi-Task Learning, MTL)

    目录 显示 1 背景2 什么是多任务学习 xff1f 3 多任务学习如何发挥作用 xff1f 3 1 提高泛化能力的潜在原因3 2 多任务学习机制3 3 后向传播多任务学习如何发现任务是相关的4 多任务学习可被广泛应用 xff1f 4 1
  • Zhong__一文通透Casbin

    时间 xff1a 2021 12 06 环境 xff1a Windows 目的 xff1a Casbin简介与使用 希望对大家有帮助 说明 xff1a 以官方文档为基础来讲解与拓展详解 xff0c 并最终帮助大家在项目中使用 xff01 本

随机推荐

  • Linux多线程调度策略

    转自 xff1a http blog csdn net byperseverance article details 44522731 Linux线程的调度策略分为3个 xff1a SCHED OTHER xff0c SCHED FIFO
  • HDFS操作语句

    HDFS操作语句 本地交互 上传重命名 xff1a hdfs dfs put xx csv srv bigdata xxxx csv 上传 xff1a hdfs dfs put xx csv srv bigdata 强制上传 xff1a h
  • 【ubuntu】Ubuntu 各版本代号简介

    一 版本及代号说明 Ubuntu中 xff0c 每个版本都有一个更为特色的名字 xff0c 这个名字由一个形容词和一个动物名称组成 xff0c 并且 xff0c 形容词和名词的首字母都是一致的 Ubuntu版本的命名规则是根据正式版发布的年
  • 一行代码加速你的Pandas数据探索分析

    本文3分钟 xff0c 大幅提升分析数据效率 我们知道 xff0c pandas库为EDA提供了许多非常有用的功能 但是 xff0c 在能够应用大多数功能之前 xff0c 通常必须先从更通用的功能开始 xff0c 例如df describe
  • 无需虚拟机或双系统!Windows下愉快地使用Linux子系统

    文章目录 说明一 启用 适用于Linux的Windows子系统 WSL 二 启用开发人员模式三 下载linux安装包相关深入学习Ubuntu子系统的资料参考资料 本文阅读3分钟 xff0c 你将获得如下方案 xff0c 在轻量使用场景下 x
  • 解决GitHub的raw.githubusercontent.com无法连接问题

    问题描述 xff1a Ubuntu下连接raw githubusercontent com失败 wget https raw githubusercontent com madmashup targeted marketing predic
  • k2pdfopt详细教程-让kindle看遍所有pdf

    pdf拿什么拯救6寸kindle救世主登场一步一步解决图文混排扫描版pdf 书籍总结 pdf xff0c 拿什么拯救6寸kindle kindle现在已经出道paperwhite第三代了 xff08 2015年7月 xff09 xff0c
  • 图像处理PSNR及其计算(OpenCV和matlab实现)

    图像PSNR及其计算OpenCV和matlab实现 PSNR的概念PSNR编程实现 matlab实现 第一种实现方法第二种直观方法第三种实现方法 OpenCV实现 参考资料 图像PSNR及其计算 xff08 OpenCV和matlab实现
  • Caffe技巧之使用snapshot来继续网络训练

    Caffe技巧之使用snapshot来继续网络训练 Caffe技巧之使用snapshot来继续网络训练 Step 1设置solverprototxtStep 2设置运行脚本sh 有时候想在已经训练好的网络上继续之前的训练 xff0c 那么可
  • 鸿蒙最新功能及承载设备详解:HarmonyOS 2及华为全场景新品发布会全纪录

    6月2日 xff0c 华为联手CSDN直播了 HarmonyOS 2及华为全场景新品发布会 xff0c 老猿全程观看直播 xff0c 并进行了回看 xff0c 力争将发布会的核心内容在本文中概要性地呈现 一 一生万物 万物归一 首先是华为消
  • python删除网页html元素

    找到标签id 以id来删除 js span class token operator 61 span span class token string 39 var child 61 document getElementById 34 ex
  • 10.面向对象分析OOA笔记

    文章目录 概述需求陈述建立对象模型典型步骤 建立动态模型典型步骤 建立功能模型数据流图画法 定义服务 概述 识别出问题域内的类和对象 xff0c 分析它们之间的关系 xff0c 建立问题域的正确模型 三种模型中 xff0c 对象模型是最重要
  • 12.软件项目管理笔记

    文章目录 估算软件规模代码行技术KLOC功能点技术FP 估算工作量进度计划人员组织质量保证软件配置管理能力成熟度模型CMM 估算软件规模 代码行技术KLOC xff08 最小规模平均值a 43 4 最可能规模平均值 43 最大规模平均值b
  • 0.各种规格描述技术总结

    文章目录 结构化分析与设计面向对象分析与设计软件项目管理 结构化分析与设计 系统流程图 xff1a 描绘物理系统 E R图 xff1a 数据模型 层次方框图 xff1a 描绘数据结构 xff0c 数据模型 Warnier图 xff1a 描绘
  • 如何更改Git的端口号

    方法一 直接修改URL为SSH 开头 打开gitbash xff0c 进入仓库 xff0c 输入指令 xff1a git remote set url origin ssh git 64 domain com 1234 home git Y
  • vtk多平面重建(MPR)源码

    include 34 vtkSmartPointer h 34 include 34 vtkActor h 34 include 34 vtkCamera h 34 include 34 vtkCellPicker h 34 include
  • 0.1 + 0.2 不等于0.3 问题,精度的丢失和解决办法

    10个0 1相加不等于1 xff1b 这是因为浮点数精度丢失的问题 xff0c 首先知道在计算机中数字是以二进制的方式存在的 xff0c 那么在CPU中计算0 1 43 0 1时实际上是0 1的二进制的相加 xff1b xff08 0 1
  • Raspberrypi 3 系统备份还原, 基于最小系统镜像实现

    Raspberrypi 3 备份还原系统 一 为什么要备份系统 xff1f 1 经常在树莓派上调试程序 xff0c 安装各种软件 xff0c 越来越多的库和程序的安装带来的系统更改几乎是不可逆的 xff0c 一旦某个程序或者驱动出现问题 x
  • OpenStack(Kilo) + Tenant-OVS-VXLAN(ml2) + Multi-Ext-Net

    from http blog sina com cn s blog 6de3aa8a0102vl7m html 使用VirualBox创建CentOS7虚拟机 资源分配视宿主windows而定 xff0c 由于要部署OpenStack xf
  • 利用策略模式优化if-else

    一 定义 策略模式 Strategy Pattern 策略模式属于对象的行为模式 其用意是针对一组算法 xff0c 将每一个算法封装到具有共同接口的独立的类中 xff0c 从而使得它们可以相互替换 策略模式使得算法可以在不影响到客户端的情况