当前位置: 首页 > 科技观察

新一代打工族需要了解的策略设计模式

时间:2023-03-17 17:14:22 科技观察

转载本文请联系DYBOY公众号。俗话说,一切都是关于战略的。在谈论策略时,我们倾向于考虑每种情况的成本。策略也可以反映在我们的代码中。合理使用策略模式重构逻辑复杂的代码,将使项目工程更易于维护和扩展。这几天,朋友圈刷屏了“新生代农民工”。有这样一张截图:新生代民工的代码里写了大概30个ifelse逻辑。有一定的影响,最重要的是可能会被其他“新生代农民工”笑话。有经验的农民工都会用一手switchcase或者策略模式来重构代码,那么什么是策略模式呢?1.确定战略:为完成一定的战略任务,根据形势的发展而采取的行动方针和斗争方法。策略模式:一种行为设计模式,允许你定义一系列算法并将每个算法放入一个单独的类中,以便算法的对象可以相互替换。在常见的前端游戏奖励激励交互中,往往会涉及到不同的分数表现出不同的动态效果,这其实是一种条件策略。2.优缺点优点:隔离算法的实现和使用运行时可切换算法使用组合而不是继承易于扩展,符合开闭原则,可以在不修改上下文的情况下引入新策略缺点:所有策略接口需要暴露出来区分策略差异如果逻辑条件简单,使用策略模式会增加代码冗余。第三,实现策略模式是指定义一系列的算法并封装它们中的每一个。将不变部分与变化部分隔离是设计模式中的一个重要思想,而策略模式就是将算法的实现和算法的使用分开,以降低耦合度。基于策略模式的程序至少由两部分组成:策略类和环境类(Context)。策略类封装了具体的算法,负责具体的计算过程,可以理解为“执行者”。环境类(Context)接受客户端的请求,然后将请求委托给策略类,策略类可以理解为“调度器”。4、表单验证中的策略模式在Web项目中,常见的表单包括注册、登录、修改用户信息等与表单相关的功能。同时我们会在表单提交的时候做一些前端输入框的值。条件验证工作。由于用户在输入框中的输入是任意的,验证规则相对复杂。如果我们不使用设计模式,我们的代码中可能会写更多的ifelse判断逻辑,从可读性和可维护性的角度来说确实不太好。接下来,我们将从前端Web项目中常见的表单验证功能开始,逐步了解策略设计模式。4.1初级表单验证很久以前,我的表单验证可能是这样写的:varusername=$('#nuseame').val();varpassword=$('#password').val();if(!username){alert('用户名不能为空');}elseif(username.length<5){alert('用户名长度必须大于等于5');}elseif(username.length<13){alert('用户名长度需小于13');}elseif(!(/[a-z]+/i.test(username))){alert('用户名只能包含英文大小写字符')}else{regeister(username);}//密码验证的方式同上,直看好像有点不忍直视,但是可以用!4.2基于策略模式的表单验证另一种思路,结合策略模式的思想,实现一个Validator类,专门用于值验证,Validator是一个Scheduling,是策略模式中的环境类。那么我们在校验目标字段值targetValue时,其用法大致如下:Validator.addRules(targetValue,['isNonEmpty','minLength:5','maxLength:12']).valid();validator会返回判断结果字段,以及语义词的提示msg字段:return{result:false,msg:'cannotbeempty'}4.2.1Validator根据以上需求,Validator实现如下:constformatResult=(isPass:boolean=false,errMsg:string="")=>{return{result:isPass,msg:errMsg,};};constValidStrategies={isNonEmpty:function(val:string=""){if(!val)returnformatResult(false,"内容不能为空");},minLength:function(val:string="",length:string|number=0){console.log(val,length);if(typeoflength==="string")length=parseInt(length);if(val.lengthlength)returnformatResult(false,`contentlengthcannotbegreaterthan${length}`);},default:function(){returnformatResult(true);},};/***Validator*StrategyPattern-环境类,负责调整算法*/classValidator{//存储规则private_ruleExecuters:Array;constructor(){this._ruleExecuters=[];}/***addRules*添加校规则*/publicaddRules(value:string="",规则:Array){this._ruleExecuters=[];rules.forEach((rule)=>{constargs=rule.split(":");constfunctionName=args.shift()||"default";//忽略下面这里的判断类型👀construleFunc=ValidStrategies[functionNameas"isNonEmpty"|"minLength"|"maxLength"|"default"].bind(this,value);this._ruleExecuters.push({func:ruleFunc,args,});});returnthis;}/***valid*/publicvalid(){for(leti=0;i