前端利用策略模式优化if else

news2024/11/26 8:37:23

策略模式

在这里插入图片描述

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

策略模式优化if else

  • 策略模式可以用来代替多重if else语句。

Vue中使用策略模式
我们以一个表单验证的例子来看看如何使用策略模式优化if else。

methods: {
  validateForm() {
    if(this.type === 'register') {
      // do register validation
    } else if(this.type === 'login') {
      // do login validation 
    } else if(this.type === 'forget') {
      // do forget validation
    }
  }
}

这些校验规则可以抽取成策略对象:

const strategies = {
  register: function() {
    // do register validation
  },

  login: function() {
   // do login validation
  },

  forget: function() {
    // do forget validation 
  }
}

然后在validateForm中使用策略对象:

methods: {
  validateForm() {
    const strategy = strategies[this.type]
    strategy() 
  }
}

这样就替换掉了冗长的if else链。

策略模式的优点

  • 去除复杂的if else逻辑
// 策略对象
const strategies = {
  A() { //... }, 
  B() { //... }
}

methods: {
  // 直接使用策略对象,避免条件判断
  // 如不使用则存在大量if else判断
  doSomething() {
    strategies[this.type]()
  } 
}
  • 扩展性好,新增策略容易
  • 不同策略可以独立变化,不影响客户端
  • 遵循开闭原则(新增策略时无需修改原代码)
// 新增策略
strategies.C = () => {
  // 新策略C实现
}

// 客户端代码不需要修改,开闭原则
doSomething() {
  strategies[this.type]() 
}

拓展

我们可以将策略对象抽取为模块,在运行时动态加载,实现运行时策略扩展。

也可以用Composition API进一步封装策略模块。

import registerValidator from './registerValidator'
import loginValidator from './loginValidator'

export default {
  setup() {
    return {
      validators: {
        register: registerValidator,
        login: loginValidator 
      }
    }
  }
}

这样策略模式就可以大大优化if else逻辑,提升代码扩展性。

策略模式的应用场景

  • 不同的缓存策略
    可以定义内存缓存、本地存储缓存、请求缓存等不同策略,根据需要动态切换。

  • 多种排序算法
    封装冒泡排序、快速排序、归并排序等算法为策略,客户端代码不变就可以切换不同的排序方式。

  • 不同的网络请求方案
    封装 Ajax 请求、Fetch API、WebSocket等为策略对象,实现可拔插的网络请求方式。

  • 不同的日志记录方式
    文件日志、控制台日志、远程日志等可以抽象成策略来互换。

  • 不同的加密/解密算法
    对称加密、非对称加密、哈希算法等可以封装成策略对象。

  • 不同的支付方式
    微信支付、支付宝、银联等支付可以抽象成策略类。

  • 平台适配层
    抽取不同平台的适配策略,如 iOS 策略、Android 策略、Web 策略等。

  • 国际化
    封装中英文策略等,运行时动态加载所需的语言包。

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

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

相关文章

一文让你搞懂async/await存在时的执行顺序

最近在写项目,发现代码中总出现这样的内容,一直百思不得其解,后来同事说这段代码的意义是把后边的任务变成宏任务执行,这我更迷惑了,我发现自己的Promise基础还是很差,因此在摸索了几天后,感觉好…

SAP ABAP内部单位外部单位转换问题

之前没有留意,用户用了那么久也没有发现,今天用户找过来说他在前台维护的是PC,但是报表里面显示是ST。 看了一下原来这里的“内部度量单位”就是内部的、与语言无关的计量单位格式(ST)。该内部格式在输出到屏幕之前&a…

完整指南:如何使用 Node.js 复制文件

文件拷贝指的是将一个文件的数据复制到另一个文件中,使目标文件与源文件内容一致。Node.js 提供了文件系统模块 fs,通过该模块可以访问文件系统,实现文件操作,包括拷贝文件。 Node.js 中文件拷贝方法 在 Node.js 中,有…

竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的基站数据分析与可视化 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度…

Postgresql源码(114)视图权限授予逻辑

0 速查 被授权的对象在系统表中记录授权信息,例如pg_namespace中的nspacl列: {mingjieUC/mingjie,UC/mingjie,pusr1UC/mingjie}pusr1UC/mingjie的含义: mingjie是赋予者pusr1是被赋予者UC是权限,表示USAGE和CREATE 1 视图权限…

@SpringBootApplication注解的理解——如何排除自动装配 分布式情况下如何自动加载 nacos是怎么被发现的

前言 spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求。 本篇博客介绍SpringBootApplicant注解的自动加载相关内容 其他相关的Spring博客文章列表如下: Spring基…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy(5.15) ros2版本: humble 安装参考: Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可,到安装软件包的时候,若只为开发&#xff0…

C++中实现雪花算法来在秒级以及毫秒及时间内生成唯一id

1、雪花算法原理 雪花算法(Snowflake Algorithm)是一种用于生成唯一ID的算法,通常用于分布式系统中,以确保生成的ID在整个分布式系统中具有唯一性。它的名称来源于雪花的形状,因为生成的ID通常是64位的整数&#xff0…

【小白专属02】SpringBoot集成MybatisPlus

目录 前言 一、添加依赖项 二、配置数据库连接信息 三、数据库创建表 四、创建实体表 五、编写Mapper接口 六、功能测试 前言 上节回顾 上一节我们对SpringBoot框架进行了搭建,其实按照流程走问题不大。最主要的部分我们把下载SpringBoot demo的网址换成了…

编程每日一练(多语言实现)基础篇:百元买百鸡

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现 一、实例描述 中国古代数学家张丘建在他的 《算经》 中提出了一个著名的 "百钱买百鸡问题", 鸡翁一,值钱五&…

重新定义旅行,AnyGo for Mac让你畅享虚拟GPS位置的无限可能!

旅行是一种令人兴奋和激动人心的体验,而现在有了AnyGo for Mac这款强大的虚拟GPS位置工具,你将能够重新定义旅行,尽情探索全新的地理环境和体验! AnyGo for Mac为你带来了全新的旅行方式。无需离开家门,你就可以通过模…

基于php的物流信息公共平台设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于php的物流信息公共平…

面对海量数据挑战,企业怎样进行数据处理?

海量数据给企业带来机遇的同时,也给企业带来了一定的挑战。怎样高效处理海量数据也是成为了企业面临的重要问题。 一:数据采集 数据采集是数据处理的第一步。企业需要进行数据采集,但是要保证数据的准确性以及安全性。同时需要注意&#xf…

PgSQL-向量数据库插件-lantern

PgSQL-向量数据库插件-lantern 即pgvector、pg_embedding 后又一向量数据库扩展Lantern问世了。当然也为向量列提供了hnsw索引以加速ORDER BY... LIMIT查询。Lantern使用usearch实现hnsw。 使用方法 保留了标准PgSQL接口,兼容其生态工具。首先需要安装该插件&#x…

服务器基础知识:raid卡有什么优势?

当今直播电商、短视频呈现热火朝天的趋势,是近两年的商业热门议题,以淘宝天猫、拼多多、抖音、小红书、视频号为代表的平台数据量呈现爆炸性的增长。据IDC预测,2025年全球数据总量将增至175ZB(1ZB1万亿GB),…

数字电视码流分析仪通用规范

声明 本文是学习GB-T 26274-2010 数字电视码流分析仪通用规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了数字电视码流分析仪(以下简称码流分析仪)的技术要求、试验方法、检验规则及标 志、包装、运输、贮存等。 本标准适…

C++代码示例:组合数简单生成工具

文章目录 前言代码仓库内容代码(有详细注释)编译和运行命令结果总结参考资料作者的话 前言 C代码示例:组合数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

echarts 折线组件

echarts 折线组件 <template><div class"lineChartsTemplate" :id"chartsId"></div> </template><script> export default {name: "lineChartsTemplate",components: {},props: {xData: {type: Array,default: ()…

个人在运行python代码过程中的坑230928

0关于GPT和百度使用的区别 就我个人使用经验而言&#xff0c;我觉得百度、知乎、csdn更是直接奔着解决问题去的&#xff0c;直接方便快捷&#xff0c;不需要你再对信息进行加工&#xff0c;可以直接找到经验。 GPT则是需要我们给他一个输入&#xff0c;给他一个提示&#xff0…

提高网申通过率的秘籍,校园招聘之春招秋招都有效

提高网申通过率的秘籍&#xff01;校园招聘&#xff08;校招-春招-秋招&#xff09;都有效。 网申&#xff0c;指的是在网上申请招聘企业的岗位&#xff0c;每年春招秋招&#xff0c;都是毕业生们的重点大事&#xff0c;如何把握好机会&#xff0c;就在于各个环节的细节之处&…