使用策略模式优化大量if...else代码

2023-05-16

一. 场景

假如我们有一个订单业务,根据会员的类型不同,使用if...else判断,然后去执行不同的业务操作,伪代码如下:

public class OrderService {

  public void method(HttpServletRequest req) {
    //type:会员类型
    String type = req.getParameter("type");
    if("free".equals(type)) {
      System.out.println("免费用户业务开始。。。");
    } else if("normal".equals(type)) {
      System.out.println("普通会员业务开始。。。");
    } else if("high".equals(type)) {
      System.out.println("高级会员业务开始。。。");
    } else if("super".equals(type)) {
      System.out.println("超级会员业务开始。。。");
    } else {
      throw new Exception("类型错误.");
    }
  }
}

根据会员的类型type,在if...else判断是免费用户、普通会员、高级会员、超级会员,执行对应的业务操作。

实际业务可能会更多,叠加很多的if...else,代码看起来很臃肿,不容易维护

二. 优化

策略模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

设计模式里的策略模式,可以用来优化if...elseswitch...case多重条件语句的代码

  1. 抽象业务处理器

    public abstract class AbstractHandler {
      public abstract void handle();
      public abstract String type();
    }
    
  2. 把业务处理器和处理的类型放到一个容器里

    @Component
    public class AbstractHandlerProcessor implements ApplicationContextAware {
      
      private ApplicationContext context;
      
      private Map<String, AbstractHandler> processorMap = new HashMap<>();
      
      public AbstractHandler choose(String type) {
        AbstractHandler handler = map.get(type);
        if(null == handler) {
          throw new Exception("不支持的type类型,联系管理员。。。")
        }
        return handler;
      }
      
      @PostConstruct
      public void register() {
        Map<String, AbstractHandler> handlerMap = context.getBeansOfType(AbstractHandler.class);
        for(AbstractHandler handler : handlerMap.values()) {
          processorMap.put(handler.type(),handler);
        }
      }
      
      @Override
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context=applicationContext;
      }
    }
    

    PostConstruct注解会在应用启动时候,加载所有AbstractHandler类型的处理器,放到AbstractHandlerProcessormap容器中。注意加@Component注解

  3. 编写响应的处理器

    /**
     * 免费用户
     */
    @Component
    public class FreeHandler extends AbstractHandler {
      
        @Override
        public void handle() {
            System.out.println("免费用户业务开始。。。");
        }
    
        @Override
        public String type() {
            return "free";
        }
    }
    
    /**
     * 普通会员
     */
    @Component
    public class NormalHandler extends AbstractHandler {
      
        @Override
        public void handle() {
            System.out.println("普通会员业务开始。。。");
        }
    
        @Override
        public String type() {
            return "normal";
        }
    }
    
    /**
     * 高级会员
     */
    @Component
    public class HighHandler extends AbstractHandler {
      
        @Override
        public void handle() {
            System.out.println("高级会员业务开始。。。");
        }
    
        @Override
        public String type() {
            return "high";
        }
    }
    
    /**
     * 超级会员
     */
    @Component
    public class SuperHandler extends AbstractHandler {
      
        @Override
        public void handle() {
            System.out.println("超级会员业务开始。。。");
        }
    
        @Override
        public String type() {
            return "super";
        }
    }
    
  4. 测试

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes=Application.class)// 指定spring-boot的启动类
    public class HandlerTest {
    
        @Autowired
        private AbstractHandlerProcessor chooser;
    
        @Test
        public void test() throws Exception{
            //准备数据
            String type = "free";
            //获取任务类型对应的solver
            AbstractHandlerProcessor processor = chooser.choose(type);
            //调用不同handle的方法进行处理
            processor.handle();
        }
    }
    

三. 总结

优点

  1. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如if...else 语句、switch...case语句。
  2. 符合面向对象的开闭原则,在不修改原来代码的情况下,可以很好的扩展
  3. 算法的使用放到环境类,算法的实现放到具体的策略类,实现了二者的分离

缺点

  1. 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类
  2. 策略模式造成很多的策略类,增加维护难度
  3. 增加了学习成本和维护成本
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用策略模式优化大量if...else代码 的相关文章

  • Python if else条件语句你懂了吗?

    在 Python 中 xff0c 可以使用 if else 语句对条件进行判断 xff0c 然后根据不同的结果执行不同的代码 xff0c 这称为选择结构或者分支结构 Python 中的 if else 语句可以细分为三种形式 xff0c 分
  • Python if-else使用

    1 从键盘上输 个数 xff0c 显示它的绝对值 不允许使 abs num 61 float input 34 请输入一个实数 xff1a 34 if num gt 0 print num else print num 2 假设 户名为ad
  • Python------- if-else语句介绍

    Python的if else语句是一个判断性语句 xff0c 要判断就需要有条件以及满足条件和不满足条件的情况 xff0c 以下就此进行说明 1 if else的使用格式 xff1a if 条件 xff1a 满足条件所要做的事情 else
  • java 去掉 if else_Java 通过注解消除if else

    半夜睡醒出门吃宵夜回家锁坏了 被逼无奈去了网吧正好想起之前构思的消除ifelse的方案正好就试了试 经过几小时奋斗修修改改终于实现了效果 特此分享 具体的流程如上 大概的场景是 在 web项目中有很多方法是要携带token或其他的操作才可以
  • if else if else语句格式_Java中我如何去除if...else...语句?

    读牛人技术博客 A Java Geek 最开始觉得这样的想法很有创意 提前使用静态代码块把对象存入map容器中 xff0c 在需要的时候在取 他也有提到可以使用DI的方式把需要的对象提前注入好 xff0c 但是这两种方式都会造成内存的浪费
  • python中if else语句格式_Python if else条件语句

    我们前面看到的代码都是按顺序执行的 xff0c 也就是先执行第一条语句 xff0c 再执行第二条和第三条语句 一直到最后一条语句 xff0c 这就是所谓的顺序结构 然而 xff0c 在许多情况下 xff0c 序列结构的代码远远不够 比如一个
  • python中if else语句_Python if else条件语句

    条件语句用来判定所给条件是否满足要求 xff0c 根据判定的结果 xff0c 决定接下来的操作 条件语句是一种控制结构 xff0c 因为它们允许根据定义的特定条件 xff0c 控制在何时执行哪一部分的代码 条件语句是 Python 中最重要
  • matlab实现if else 的语句格式

    matlab代码 比较a与b的大小 xff0c 将较小值赋给较大值 if a lt b b 61 a else a 61 b end
  • Python if else语句用法规范(注意事项)

    在使用 if elif else 条件语句时 xff0c 需要初学者根据实际应用场景 xff0c 自行设计表达式和代码块 xff0c 而在这两部分中 xff0c 有些细节需要初学者注意 1 代码块不要忘记缩进 代码块一定要缩进 xff0c
  • Java 中如何使用枚举来消除 if/else

    今天 xff0c 准备重新学习一下 Java 中的枚举类型 为什么现在要去重新学习呐 xff1f 因为在刚开始学习 Java 的时候 xff0c 对于枚举这一块的学习不太重视 xff0c 工作之后发现用到枚举的地方挺多的 xff0c 就有了
  • Vue指令之v-else篇

    讲完v if篇 xff0c 那么接下里我们就说说v else喽 对比java中的if 条件 条件成立执行的语句 else 条件不成立执行的语句 我相信你的脑瓜子已经转了90度 xff0c 已经完全搞明白Vue的v else该怎么用了 没错
  • Python:同行if...else...详细教程

    我最近为游戏Apple Clicker写成就系统 xff0c 加上后整个程序的代码竟然超过2200行 xff0c 窗口启动时间也很慢 xff0c 主要是if else 使用的太多 于是查了查缩短代码的方法 xff0c 总结如下 xff1a
  • 使用策略模式优化大量if...else代码

    一 场景 假如我们有一个订单业务 xff0c 根据会员的类型不同 xff0c 使用if else判断 xff0c 然后去执行不同的业务操作 xff0c 伪代码如下 xff1a span class token keyword public
  • 在C++中使用map来取代很多个if else和switch

    在C 43 43 中使用map来取代很多个if else和switch 利用map中的key和value键值对来取代if else效率会好不少 span class token macro property span class token
  • windows bat脚本使用if else(亲测可用)

    chcp 65001 64 echo off set p username 61 请输入用户名 if 34 username 34 61 61 34 admin 34 echo 欢迎管理员登录 xff01 else echo 用户名错误 x
  • GMT、UTC与24时区 等时间概念

    许多人都知道两地时间表简称为GMT或UTC 而世界时区表则通称为World Time 那么GMT与UTC的实质原意又是为何 世界时区又是怎么区分的 面盘上密密麻麻的英文单字代表着什么意义与作用呢 这些都是新手在接触两地时间表或世界时区表时
  • Hexo博客搭建部署GitHub

    Hexo博客 Hexo是一个简洁的静态博客页面 使用markdown渲染文件 在本地生产静态文件后可以部署到GitHub上 这样不需要占用自己的域名和服务器 其实我在很早之前就换用了hexo 原来的博客在csdn oceansec blog
  • 安卓混合开发,使用WebView控件展示网页

    页面使用webview控件来实现 WebView是Android系统提供能显示网页的系统控件 它是一个特殊的View 他的作用就是 显示和渲染Web页面 加载网络上或本地assets中的html文件 与JavaScript交互调用 常用于同
  • 机械革命z2黑苹果改造计划第三番-macOS键盘快捷键&Win键盘适配

    macOS键盘快捷键 Win键盘适配 键盘区别 首先下图是苹果妙控键盘无指纹版 官网售价699 穷学生的我是真的买不起 然后下图是我正在使用的机械键盘ikbc w200 87键版本 可以看出两者在键位排列上的区别主要在于 win comma
  • 【学习笔记之操作系统原理篇】进程管理

    进程的概念 进程 单道程序 特点 顺序性 封闭性 独占性 可再现性 多道程序系统 特点 间断性 相互制约竞争资源 失去封闭性 共性资源 多个程序操作相同资源 不可再现性 运行结果不唯一 因为执行顺序不唯一 进程特征 动态性 一个进程可以对应

随机推荐

  • VMware安装linux虚拟机(完整版)

    vmware的安装 去官网进行下载虚拟机 虚拟机下载地址 xff1a VMware16下载 vmware workstation pro 16官方版下载 虚拟机 华军软件园 第一步 打开安装包 第二步 选择稍后安装 是最快的方式 第三步 看
  • AWK中BEGIN和END的使用理解

    awk中begin和end的使用 awk使用 语法 awk 39 script 39 filenames awk使用语法中的script又由多个pattern 43 action组成 单个 pattern actions 应用不通的patt
  • 教你彻底搞懂Cocos Creator Tween

    Cocos 使用了Tween来代替原来的Action系统 今天来给大家讲解Tween如何使用 帮助大家掌握Tween的使用 xff0c 并且对Tween有一个更深入的了解 这里有个cocos creator学习交流点击可以直接进入 1 Tw
  • Hexo的常用指令合集

    Hexo xff1a 一个基于Node js的静态网页生成器 xff0c 常将它与Github Page搭配使用 xff0c 创建个人博客网站 hexo有许多主题 xff0c 其实最火爆的是NexT Matery等 xff0c 复制关键词到
  • (Demo3D 学习笔记)案例2:飞板传输货物,并按指定货位上架

    1 模型描述 通过红色飞板 xff0c 将输送机处的货物逐个传送到货架指定货位 xff0c 货位由货位表指定 2 模型布局 3 解决方案 3 1 载荷发生器 首先给载荷发生器创建自定义属性Loc xff0c 类型为表 在载荷发生器的属性窗口
  • (Demo3D 学习笔记)案例1:自创组件,可以一键自动连接场景中的其他相关组件

    1 模型描述 在场景中自创一个组件 xff0c 通过该组件 xff0c 可以一键自动连接场景中的各相关组件 2 模型布局 首先将自定义组件 xff08 绿色 xff09 分别连接输送机 xff08 左 xff09 xff0c 叉车 xff0
  • Ubuntu18.04安装配置使用Intel RealSense D435i深度相机以及在ROS环境下配置

    最近因为学习开发需要 xff0c 要开始接触一些视觉相关的内容 xff0c 拿到了一个Inter 的D435i深度相机 xff0c 记录一下在Ubuntu18环境下配置SDK 包的历程 目录 写在开头最新的SDK 支持ROS2 Wrappe
  • C++标准模板库(STL)迭代器的原理与实现

    引言 迭代器 iterator 是一种抽象的设计理念 xff0c 通过迭代器可以在不了解容器内部原理的情况下遍历容器 除此之外 xff0c STL中迭代器一个最重要的作用就是作为容器 vector list等 与STL算法的粘结剂 xff0
  • Linux工具 xrandr屏幕操作工具

    说明 xff1a xrandr是RandR xff08 调整大小和旋转 xff09 X 窗口系统扩展的官方配置实用程序 它可用于设置屏幕输出的大小 方向 以及 需配置多台显示器的显示扩展等 属于Xorg的命令集中常用命令之一 xff08 关
  • 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD

    一 文章前言 入手了一块小熊派开发板 xff0c 看到他板子上搭载了一块 TFT LCD 编写编写驱动代码来使用 TFT xff0c 该 TFT 通过 ST7789 驱动芯片进行驱动 xff0c 本文通过 CubeMX 软件配置硬件 SPI
  • 【双系统】Win10/Win11 引导 Ubuntu

    文章目录 纲要注意写在最前1 Win 分区2 Ubuntu刻盘3 安装 Ubuntu4 配置引导 纲要 本文主要介绍了如何在已安装 Win10 Win11 前提下安装 Ubuntu 双系统 xff0c 并利用 Win10 Win11 的 M
  • 2.6 常见关系数据库产品

    常见关系数据库产品 1 Oracle 应用广泛 功能强大 xff0c 分布式数据库系统 关系 对象 型数据库 2 MySQL 快捷 可靠 开源 免费 与PHP组成经典的LAMP组合 3 SQLServer 针对不同用户群体的五个特殊的版本
  • 结构体定义寄存器方法(很流行哦)

    ARM寄存器数量之多 xff0c 叹为观止 xff01 幸运的是 xff0c 它都是以模块分布 xff0c 再依托C语言的模块化编程 xff0c 用户就没有必要记忆那么多的寄存器名称了 xff01 拿LPC1114来说 xff0c 单片机内
  • 代码函数调用关系图

    代码函数调用关系 Graphviz 43 CodeViz http www linuxidc com Linux 2015 01 111501 htmCallgraph xff1a 静态分析 C 程序函数调用关系图cflow 43 grap
  • Python元组(tuple),字符串,读取文件。

    目录 tuple xff1a tuple格式 xff1a tuple和列表的区别 xff1a 查询类型小方法 xff1a string 字符串 xff1a 字符串格式 xff1a 三种格式的区别 xff1a 1 单引号 xff0c 双引号换
  • 各种课程教学安排

  • 驱动测试时出现can't open 的一种情况

    提前声明 xff1a 本程序是使用class device create函数导致的错误 xff0c 如果不是使用该函数不要对号入座 xff0c 谢谢 在今天编写完驱动程序 xff0c 然后使用测试程序测试时 xff0c 却出现了can 39
  • Ubuntu 20.04上安装ROS

    文章目录 前言一 Ubuntu 20 041添加ROS源2更新软件源3配置及更换最佳软件源4安装ROS5初始化rosdep6设置环境变量7安装rosinstall8验证是否安装成功 总结 前言 在虚拟机VMware上安装了Ubuntu 20
  • 头文件只能放变量的声明但是不能放定义

    一般的做法都是在头文件 h 中声明变量 xff0c 然后在源文件 c 中定义变量 如果在头文件中定义变量 xff0c 这个变量就有了实体 xff0c 如果a c和b c一起引用了头文件head h xff0c 就等于同时创建了两个同样名字的
  • 使用策略模式优化大量if...else代码

    一 场景 假如我们有一个订单业务 xff0c 根据会员的类型不同 xff0c 使用if else判断 xff0c 然后去执行不同的业务操作 xff0c 伪代码如下 xff1a span class token keyword public