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

面试官:说说你对策略模式的理解?应用场景?

时间:2023-03-22 13:40:47 科技观察

一、什么是StrategyPatternStrategyPattern是指定义一系列算法,并把它们一个一个封装起来。目的是将算法的使用与算法的实现分开。一个基于策略模式的程序至少由两部分组成:策略类,策略类封装了具体的算法,并负责具体的计算过程环境类Context,Context接受客户的请求,然后将请求委托给某个策略类2。比如公司年终奖的考核,是根据员工的工资和绩效来考核的。业绩A者,年终奖金为工资的4倍;B类业绩,年终奖金为工资的3倍;对于C绩效,年终奖是4倍工资如果2倍用if实现,代码如下:varcalculateBouns=function(salary,level){if(level==='A'){returnsalary*4;}if(level==='B'){returnsalary*3;}if(level==='C'){returnsalary*2;}};//调用如下:console.log(calculateBouns(4000,'A'));//16000console.log(calculateBouns(2500,'B'));//7500从上面我们可以看出函数中包含了太多的if...else,并且在make的时候后续修正,需要在函数内部添加逻辑,违反了开放封闭原则。如果使用strategy模式,就是先定义一系列算法,一个一个封装起来,将不变的部分和变化的部分分开,如下:varobj={"A":function(salary){returnsalary*4;},"B":function(salary){returnsalary*3;},"C":function(salary){returnsalary*2;}};varcalculateBouns=function(level,salary){returnobj[level](salary);};console.log(calculateBouns('A',10000));//40000上面代码中obj对应策略类,calculateBouns对应上下通信类。例如,实现一个表单验证的代码往往是这样写的:varregisterForm=document.getElmentById("registerForm");registerForm.onsubmit=function(){if(registerForm.userName.value===''){alert('用户名不能为空');return;}if(registerForm.password.value.length<6){alert("密码长度不能小于6位");return;}if(!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)){alert("电话号码格式不正确");return;}}以上代码包含多个if语句,违反了开放封闭原则。如果应用中还有其他表单,需要重复编写这里的代码也可以使用策略模式进行重构和验证。第一步确定不变的内容,即策略规则对象,如下:varstrategy={isNotEmpty:function(value,errorMsg){if(value===''){returnerrorMsg;}},//限制最小长度minLength:function(value,length,errorMsg){if(value.length