news 2026/4/3 4:50:10

设计模式之-策略模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式之-策略模式

策略模式定义:

策略模式定义了一系列的算法,并且会将每一个算法封装起来,让它们可以相互的替换。

策略模式的组成:

一个基于策略模式的程序至少由两部分组成,第一部分是一组策略类,策略类封装了具体的算法,并负责具体计算过程,第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类,说明Context中要维护对某个策略对象的引用

// 策略接口interfaceIStrategy{execute(a:number,b:number):number;}// 定义具体的策略类// 这里定义了四个具体的策略类,分别是加法、减法、乘法和除法classAddStrategyimplementsIStrategy{execute(a:number,b:number):number{returna+b;}}classSubStrategyimplementsIStrategy{execute(a:number,b:number):number{returna-b;}}classMulStrategyimplementsIStrategy{execute(a:number,b:number):number{returna*b;}}classDivStrategyimplementsIStrategy{execute(a:number,b:number):number{returna/b;}}// 上下文内部维护了具体的策略的引用// 回头客户端调用的时候,只需要调用上下文的方法即可classContext{// 维护具体的策略privatestrategy:IStrategy;constructor(st:IStrategy){this.strategy=st;}// 设置新的策略setStrategy(st:IStrategy){this.strategy=st;}//执行策略方法executeStrategy(a:number,b:number):number{returnthis.strategy.execute(a,b);}}// 创建一个上下文对象// 在创建的时候,传递一个默认的执行策略constcontext=newContext(newAddStrategy());// 执行对应的策略consta=5;constb=3;constresult=context.executeStrategy(a,b);context.setStrategy(newSubStrategy())constresult2=context.executeStrategy(a,b);context.setStrategy(newMulStrategy());constresult3=context.executeStrategy(a,b);console.log(result);console.log(result2);console.log(result3);

再来看一个表单的例子

<formid="registerForm"action="#">请输入用户名:<inputtype="text"name="username"/>请输入密码:<inputtype="text"name="password"/>请输入手机号:<inputtype="text"name="phoneNumber"/><buttonid="button">提交</button></form><script>varregisterForm=document.getElementById('registerForm');varbutton=document.getElementById('button');button.onclick=function(){if(registerForm.username.value===''){console.log('用户名不能为空');returnfalse}if(registerForm.password.value.length<6){console.log('密码长度不能少于6位');returnfalse}if(!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)){console.log('手机号码格式不正确');returnfalse}}</script>

这是一种很常见的做法,提交函数比较庞大,缺少弹性,违反开放-封闭原则
下面用策略模式来重构表单校验

varstrategies={isNonEmpty:function(value,errorMsg){// 不为空if(value===''){returnerrorMsg;}},minLength:function(value,length,errorMsg){// 限制最小长度if(value.length<length){returnerrorMsg;}},isMobile:function(value,errorMsg){// 手机号码格式if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){returnerrorMsg;}}}varvalidataFunc=function(){varvalidator=newValidator();// 创建一个validator对象// 添加一些校验规则validator.add(registerForm.username,'isNonEmpty','用户名不能为空');validator.add(registerForm.password,'minLength:6','密码长度不能少于6位');validator.add(registerForm.phoneNumber,'isMobile','手机号码格式不正确');varerrorMsg=validator.start();// 获得校验结果returnerrorMsg;// 返回校验结果}varregisterForm=document.getElementById('registerForm');varbutton=document.getElementById('button');button.onclick=function(e){e.preventDefault();varerrorMsg=validataFunc();// 如果有返回值,说明未通过校验if(errorMsg){console.log(errorMsg);returnfalse;}}varValidator=function(){this.cache=[];// 保存校验规则}Validator.prototype.add=function(dom,rule,erroeMsg){vararg=rule.split(':');// 把strategy和参数分开this.cache.push(function(){// 把校验的步骤用空函数包装起来,并且放入cachevarstrategy=arg.shift();// 用户挑选的strategyarg.unshift(dom.value);arg.push(erroeMsg);returnstrategies[strategy].apply(dom,arg);})}Validator.prototype.start=function(){for(leti=0,validataFunc;validataFunc=this.cache[i++];){varmsg=validataFunc();// 开始校验,并取得校验后返回信息if(msg){// 有返回值,说明校验没有通过returnmsg;}}}

非原创,来源渡一谢杰老师和javascript设计模式与开发实践 -曾探 简单记录,周五啦,周末愉快

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 20:19:02

Langchain-Chatchat如何集成拖拽上传功能?交互体验升级

Langchain-Chatchat如何集成拖拽上传功能&#xff1f;交互体验升级 在企业知识管理日益智能化的今天&#xff0c;越来越多团队开始部署基于大语言模型&#xff08;LLM&#xff09;的本地知识库系统。Langchain-Chatchat 作为当前最受欢迎的开源方案之一&#xff0c;凭借其对私有…

作者头像 李华
网站建设 2026/4/2 12:41:26

Open-AutoGLM任务规划与执行解耦架构(解耦设计十大实践法则)

第一章&#xff1a;Open-AutoGLM任务规划与执行解耦架构概述 Open-AutoGLM 是一种面向复杂任务自动化的大语言模型系统架构&#xff0c;其核心设计理念在于将任务的“规划”与“执行”过程进行逻辑分离。该架构通过解耦策略提升系统的可维护性、灵活性与可扩展性&#xff0c;使…

作者头像 李华
网站建设 2026/4/2 13:13:08

手把手教你部署Langchain-Chatchat实现文档自动回答

手把手教你部署Langchain-Chatchat实现文档自动回答 在企业知识管理日益复杂的今天&#xff0c;员工常常需要花费大量时间查找制度文件、产品手册或合规条款。而当一个新员工提问“年假怎么申请&#xff1f;”时&#xff0c;HR却要翻遍多个PDF和内部Wiki才能给出答案——这种低…

作者头像 李华
网站建设 2026/3/31 2:12:35

Langchain-Chatchat如何实现问答结果打印功能?物理存档

Langchain-Chatchat如何实现问答结果打印功能&#xff1f;物理存档 在企业数字化转型不断深入的今天&#xff0c;信息的准确性与可追溯性已成为组织管理的核心诉求。尤其是在人力资源、法务合规、内部审计等场景中&#xff0c;仅“看到”AI的回答是远远不够的——人们更需要一份…

作者头像 李华
网站建设 2026/3/29 3:43:50

Langchain-Chatchat在设备操作手册查询中的实际效果

Langchain-Chatchat在设备操作手册查询中的实际效果 在工业制造、能源设施或通信设备运维现场&#xff0c;一个常见的场景是&#xff1a;技术人员面对突发故障&#xff0c;手握厚重的操作手册&#xff0c;却要在数百页PDF中逐章翻找“E02报警如何处理”。这种低效不仅延误维修时…

作者头像 李华
网站建设 2026/4/2 1:37:48

随时拥有一台云电脑!OEC/OEC-T群晖部署远程唤醒电脑功能

最近小白入手了OEC-T&#xff08;OEC和OEC-T只是内存大小不一样&#xff0c;下面简称OEC&#xff09;&#xff0c;刷了群晖之后就放着闲置了。今天突然想到&#xff1a;把设备开机放家里&#xff0c;功耗低的情况下&#xff0c;电费基本忽略不计&#xff0c;还可以玩各种项目。…

作者头像 李华