前端开发设计模式——策略模式
目录
一、策略模式的定义和特点
1.定义:
2.特点:
二、策略模式的实现方式
1.定义策略接口:
2.创建具体策略类:
3.定义上下文类:
三、策略模式的应用场景
1.表单验证场景:
2.动画效果切换场景:
3.数据处理和格式化场景:
四、策略模式的优点
1.可维护性:
2.可扩展性:
3.灵活性:
五、策略模式的缺点
1.增加代码复杂度:
2.性能开销:
六、策略模式的注意事项
1.策略命名规范:
2.策略的选择逻辑:
3.策略的可测试性:
一、策略模式的定义和特点
1.定义:
策略模式是一种行为设计模式,它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。在前端开发中,策略模式允许根据不同的情况动态地选择和应用不同的算法或行为,而无需修改使用这些算法的主体代码。
2.特点:
算法封装:将不同的算法封装在独立的策略类中,每个策略类实现特定的行为逻辑。
可替换性:不同的策略可以在运行时相互替换,使得系统更加灵活。
解耦性:策略模式将算法的实现与使用算法的主体代码解耦,提高了代码的可维护性和可扩展性。
二、策略模式的实现方式
1.定义策略接口:
首先,定义一个策略接口,该接口声明了所有具体策略类必须实现的方法。例如:
interface Strategy {execute(): void;}
2.创建具体策略类:
实现具体的策略类,每个策略类实现策略接口中的方法,并提供特定的算法实现。例如:
class ConcreteStrategyA implements Strategy {execute() {console.log('Executing strategy A.');}}class ConcreteStrategyB implements Strategy {execute() {console.log('Executing strategy B.');}}
3.定义上下文类:
上下文类持有一个策略对象的引用,并通过该引用调用策略对象的方法。上下文类可以在运行时设置不同的策略对象。例如:
class Context {private strategy: Strategy;constructor(strategy: Strategy) {this.strategy = strategy;}setStrategy(strategy: Strategy) {this.strategy = strategy;}executeStrategy() {this.strategy.execute();}}
三、策略模式的应用场景
1.表单验证场景:
根据不同的表单字段类型和需求,可以使用不同的验证策略。例如,对于电子邮件字段,可以使用一个验证电子邮件格式的策略;对于密码字段,可以使用一个验证密码强度的策略.
示例:
(1)定义策略接口:
interface ValidationStrategy {validate(value): boolean;
}
(2)创建具体策略类:
邮箱验证策略:
class EmailValidationStrategy implements ValidationStrategy {validate(value) {const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;return emailRegex.test(value);}}
密码长度验证策略:
class PasswordLengthValidationStrategy implements ValidationStrategy {validate(value) {return value.length >= 8;}}
(3)定义上下文类(表单组件):
class FormComponent {private validationStrategy: ValidationStrategy;constructor(strategy: ValidationStrategy) {this.validationStrategy = strategy;}setValidationStrategy(strategy: ValidationStrategy) {this.validationStrategy = strategy;}validateInput(value) {return this.validationStrategy.validate(value);}
}
(4)使用示例:
// 使用邮箱验证策略
const emailFormComponent = new FormComponent(new EmailValidationStrategy());
const isEmailValid = emailFormComponent.validateInput('test@example.com');
console.log('Email is valid:', isEmailValid);// 切换为密码长度验证策略
emailFormComponent.setValidationStrategy(new PasswordLengthValidationStrategy());
const isPasswordValid = emailFormComponent.validateInput('12345678');
console.log('Password is valid:', isPasswordValid);
2.动画效果切换场景:
在前端动画中,可以根据不同的场景和用户交互选择不同的动画效果策略。例如,在页面加载时可以使用一种淡入效果,在用户点击按钮时可以使用一种弹出效果。
示例:
(1)定义策略接口:
interface AnimationStrategy {animate(element): void;
}
(2)创建具体策略类:
淡入动画策略:
class FadeInAnimationStrategy implements AnimationStrategy {animate(element) {element.style.opacity = '0';let opacity = 0;const interval = setInterval(() => {opacity += 0.1;element.style.opacity = opacity.toString();if (opacity >= 1) {clearInterval(interval);}}, 100);}}
弹出动画策略:
class PopupAnimationStrategy implements AnimationStrategy {animate(element) {element.style.transform = 'scale(0)';let scale = 0;const interval = setInterval(() => {scale += 0.1;element.style.transform = `scale(${scale})`;if (scale >= 1) {clearInterval(interval);}}, 100);}}
(3)定义上下文类(动画控制器):
class AnimationController {private animationStrategy: AnimationStrategy;constructor(strategy: AnimationStrategy) {this.animationStrategy = strategy;}setAnimationStrategy(strategy: AnimationStrategy) {this.animationStrategy = strategy;}startAnimation(element) {this.animationStrategy.animate(element);}
}
(4)使用示例:
// 使用淡入动画策略
const fadeInController = new AnimationController(new FadeInAnimationStrategy());
const elementToAnimate = document.createElement('div');
document.body.appendChild(elementToAnimate);
fadeInController.startAnimation(elementToAnimate);// 切换为弹出动画策略
fadeInController.setAnimationStrategy(new PopupAnimationStrategy());
const anotherElementToAnimate = document.createElement('div');
document.body.appendChild(anotherElementToAnimate);
fadeInController.startAnimation(anotherElementToAnimate);
3.数据处理和格式化场景:
对于不同类型的数据,可以使用不同的数据处理和格式化策略。例如,对于日期数据,可以使用不同的日期格式化策略;对于数字数据,可以使用不同的数字格式化策略。
这个就不举例了......
四、策略模式的优点
1.可维护性:
将不同的算法封装在独立的策略类中,使得代码更加清晰、易于维护。当需要修改某个算法时,只需修改相应的策略类,而不会影响其他部分的代码。
2.可扩展性:
可以方便地添加新的策略类,实现新的算法或行为,而无需修改现有的代码。这使得系统具有良好的可扩展性。
3.灵活性:
策略模式允许在运行时根据不同的情况选择不同的策略,使得系统更加灵活。可以根据用户的输入、系统状态或其他条件动态地切换策略。
五、策略模式的缺点
1.增加代码复杂度:
引入策略模式会增加代码的复杂度,特别是当有多个策略类时。需要更多的类和接口,以及更多的代码来管理策略的选择和切换。
2.性能开销:
在运行时动态地选择策略可能会带来一定的性能开销。特别是当策略的选择和切换比较频繁时,可能会影响系统的性能。
六、策略模式的注意事项
1.策略命名规范:
为了提高代码的可读性和可维护性,应该为策略类和方法使用清晰、有意义的命名规范。这样可以更容易地理解每个策略的作用和用途。
2.策略的选择逻辑:
在上下文类中,应该有明确的逻辑来选择合适的策略。可以根据用户的输入、系统状态或其他条件来选择策略。同时,应该考虑策略的优先级和适用性,以确保选择的策略是最合适的。
3.策略的可测试性:
由于策略模式将算法的实现与使用算法的主体代码解耦,因此策略类通常比较容易进行单元测试。可以为每个策略类编写独立的测试用例,确保它们的行为符合预期。同时,也应该测试上下文类对策略的选择和切换逻辑。
对于前端开发设计模式中的策略模式就分享到这,如果对设计模式中的其他模式有兴趣的话,可以点开主页看看相关文章。码字不易,点个赞再走吧
相关文章:
前端开发设计模式——策略模式
目录 一、策略模式的定义和特点 1.定义: 2.特点: 二、策略模式的实现方式 1.定义策略接口: 2.创建具体策略类: 3.定义上下文类: 三、策略模式的应用场景 1.表单验证场景: 2.动画效果切换场景&…...
SysML案例-潜艇
DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>...
车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
[2] Denoising Diffusion Probabilistic Models 作者:Jonathan Ho Ajay Jain Pieter Abbeel 单位:加州大学伯克利分校 摘要: 我们提出了高质量的图像合成结果使用扩散概率模型,一类潜变量模型从非平衡热力学的考虑启发。我们的最…...
基于深度学习的任务序列中的快速适应
基于深度学习的任务序列中的快速适应是指模型在接连处理不同任务时,能够迅速调整和优化自身以适应新任务的能力。这种能力在动态环境和多任务学习中尤为重要,旨在减少训练时间和资源需求。以下是这一主题的关键要素: 1. 快速适应的背景 动态…...
虚拟机三种网络模式详解
在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…...
[leetcode]674_最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l < i < r,都有 nums[i] < nums[i 1] &am…...
【无人机设计与技术】四旋翼无人机,UAV仿真,轨迹跟踪PID控制
摘要 本文探讨了四旋翼无人机(UAV)在轨迹跟踪中的PID控制仿真方法。通过设计三轴方向的PID控制器,调节无人机的姿态与位置,使其能够准确跟踪预设轨迹。本文使用MATLAB/Simulink进行了建模与仿真,验证了PID控制算法在无…...
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测
回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提取特征与原始特征进行融合预测 文章目录 一、基本原理原理流程总结 二、实验结果三、核心代码四、代码获取五、总结 回归预测|基于卷积神经网络-支持向量机的数据回归预测Matlab程序CNN-SVM 卷积提…...
javaScript基础知识汇总
一、基础语法 1、区分大小写:无论是变量、函数名还是操作符,都区分大小写。 2、标识符:就是变量、函数、属性或函数参数的名称。标识符可以由一个或多个字符构成,但需要满足以下条件: 第一个字符必须是一个字母、下…...
《动手学深度学习》笔记2.2——神经网络从基础→进阶 (参数管理-每层的权重/偏置)
目录 0. 前言 正文:参数管理 1. 参数访问 1.1 [目标参数] 1.2 [一次性访问所有参数] 1.3 [从嵌套块收集参数] 2. 参数初始化 2.1 [内置初始化] 2.2 [自定义初始化] 2.3 [参数绑定-共享参数] 3. 小结(第2节) 4. 延后初始化 (原书第…...
双端之Nginx+Php结合PostgreSQL搭建Wordpress
第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …...
Another redis desktop manager使用说明
Another redis desktop manager使用说明 概述界面介绍图示说明连接界面设置界面查看操作日志主界面信息进入redis-cli控制台更多 概述 Another Redis Desktop Manager是一个开源的跨平台 Redis 客户端,提供了简洁易用的图形用户界面(GUI)&am…...
【git】配置 Git 的换行符处理和安全性||安装 Ruby
配置 Git 的换行符处理和安全性: git config --global core.autocrlf input:这个设置确保在提交代码时,Git 会将 CRLF(Windows 的换行符)转换为 LF(Unix 的换行符),但在检出代码时不…...
VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布
VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco …...
Unity 代码裁剪(Strip Engine Code)
文章目录 0.IL2CPP 打包运行闪退问题1.什么是代码裁剪2.为什么要使用代码裁剪3.代码裁剪设置与级别4.强制保留代码4.1 使用[Preserve]标签4.2 使用Link.xml文件 5.Strip中遇到的问题及解决方法6.注意事项 0.IL2CPP 打包运行闪退问题 Google Play要求从2019年8月1日起apk必须支…...
单目3d重建DUSt3R 笔记
目录 DUSt3R 三维重建 报错RecursionError: maximum recursion depth exceeded in comparison 报错 numpy.core.multiarray failed to import 报错Numpy is not available 解决 升级版mast3r 速度变慢 修改了参数设置脚本: 测试效果 操作技巧 DUSt3R 三维重…...
AI驱动TDSQL-C Serverless 数据库技术实战营-与AI的碰撞
目录 一、简介 二、实验介绍 三、结果展示 四、实操指导 4.1 系统设计 4.2 环境搭建(手把手教程) 4.3 应用构建 4.4 效果展示 4.5 踩坑避雷总结 五、清理资源 5.1 删除TDSQL-C Serverless 5.2 删除 HAI 算力 六、实验总结归纳 一、简介 本…...
C++之String类(上)
片头 嗨!好久不见~ 今天我们来学习C的Sting类,不过,在学习它之前,我们先来对STL库有一个简单的了解。 STL(standard template library--标准模板库),是C标准库的重要组成部分,不仅是…...
kubernets基础-ingress详细介绍
文章目录 什么是IngressIngress详细说明Ingress示例 Ingress控制器Ingress控制器的工作原理Ingress控制器的特点常见的Ingress控制器 Ingress关联Ingress控制器一、Ingress资源对象二、Ingress控制器三、Ingress与Ingress控制器的关联方式四、注意事项 多实例部署一、Ingress多…...
jenkins部署Maven和NodeJS项目
在 Java 项目开发中,项目的编译、测试、打包等是比较繁琐的,属于重复劳动的工作,浪费人力和时间成本。以往开发项目时,程序员往往需要花较多的精力在引用 jar 包搭建项目环境上,跨部门甚至跨人员之间的项目结构都有可能…...
在unity资源中发现无效引用
本文主要解决在不打开unity的情况下搜索出无效引用的资源的方法 1. 概述 一般只要遍历一下目录里所有资源,判空一下就好了但有些情况下,不希望打开unity, 尤其希望是在资源整合时,想更快验证资源的合法性, 这对合并提交及出包验证时,都要较大的需求 2. 简单的验证方法 简单来…...
C#知识|基于反射和接口实现抽象工厂设计模式
哈喽,你好啊,我是雷工! 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中; 02 抽象工厂组成 抽象工厂包括抽象产品(即业务接口,可以通过抽象类或抽象接口设计)…...
【分布式微服务云原生】gRPC vs RPC:深入探索远程过程调用的现代与经典
摘要 在分布式系统的世界里,gRPC和RPC是两个耳熟能详的术语,但它们之间有何区别和联系?本文将深入探讨gRPC和RPC的概念、关键特性、以及它们在现代软件开发中的应用。你将了解到gRPC如何作为RPC的一种实现,提供高性能的跨语言远程…...
听说这是MATLAB基础?
MATLAB(矩阵实验室)是一个强大的高性能计算环境和编程语言,广泛应用于数学计算、算法开发、数据分析、可视化以及模拟等多个领域。以下是MATLAB的一些基础知识,涵盖其功能、语法、基本操作等方面。 1. MATLAB环境 工作区…...
【CSS/HTML】圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
前沿简介 圣杯布局和双飞翼布局是前端重要的布局方式。两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局。 圣杯布局来源于文章In Search of the Holy Grail,双飞翼布局来源于淘宝UED。 两者的实现方式有差异,但是都…...
数据流和数据流处理技术
一数据流 首先明确数据流概念:数据流是连续不断生成的、快速变化的无界数据序列 数据流类型: 数据流大致可以分为四种类型 1.连续型数据流:不断地产生数据,数据稳定速度输入系统。 2.突发型数据流:在某特定时间或…...
(IDEA)spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案
系列文章目录 文章目录 系列文章目录一、(IDEA)spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案1.资料 一、(IDEA)spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案 1.资料…...
解决TikTok无网络连接问题解析
随着社交媒体的快速发展,TikTok已成为全球用户最喜欢的短视频平台之一,吸引了数以亿计的用户。然而,在享受这个平台时,用户经常会遇到无网络连接的问题,这不仅影响观看体验,还可能导致无法上传内容或参与社…...
k8s中,ingress的实现原理,及其架构。
图片来源:自己画的 图片来源:k8s官网 首先,什么是ingress? 是服务还是控制器? 都不精确 ingress是一个api资源 service和deployment也是api资源。 这几个相互协作,组建成一个对外提供服务的架构。 ingress提供的…...
【数据结构强化】应用题打卡
应用题打卡 数组的应用 对称矩阵的压缩存储 注意: 1. 2.上三角的行优先存储及下三角的列优先存储与数组的下表对应 上/下三角矩阵的压缩存储 注意: 上/下三角压缩存储是将0元素统一压缩存储,而不是将对角线元素统一压缩存储 三对角矩阵的…...
搜狗推广登录入口/seort什么意思
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云,作者:小小科( 想要学习Python?Python学习交流群:1039649593,满足你的需求…...
200M电信宽带做网站/seo刷点击软件
今天是7月的第一天,是我们伟大的党的生日,也是我求职生涯的又一个起点!为了不使这个7月过得太颓废,为了我的人生大目标得以实现,制定了一个计划,内容如下:7.1——7.3 《think in java》:两个…...
网站建设主要问题/网络营销具有什么特点
前言Flutter 作为Google出品的一个新兴的跨平台移动客户端UI开发框架,正在被越来越多的开发者和组织使用,包括阿里的咸鱼、腾讯的微信等。示意图今天,我主要讲解Flutter中图片组件方面的Widget,包括Image、Icon、ImageIcon&#x…...
深圳易捷网站建设/如何seo搜索引擎优化
用JOB 企业管理器 --管理 --SQL Server代理 --右键作业 --新建作业 --"常规"项中输入作业名称 --"步骤"项 --新建 --"步骤名"中输入步骤名 --"类型"中选择"Transact-SQL 脚本(TSQL)" --"数据库"选择执…...
郑州汉狮做网站费用/优化大师有必要花钱吗
...exports PATH的上方,保存。执行curl -sS https://getcomposer.org/installer | php,然后执行mv composer.phar /usr/local/bin/composer命令,此时composer安装完成。将国外源替换为国内源composer config -g repo.packagist compos...comp…...
中车网站建设的优缺点/班级优化大师的功能
题目大意:有$2^n$个人,每相邻的两个人比赛一次。令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜;否则若$b\in S$则$b$获胜,不然$1$获胜。钦定$1$获胜,问可以的开始的顺序的方案…...