定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。
目的:将算法的使用和算法的实现分离开来。比如:if(input == 'A'){ return 1;}if(input == 'B'){ return 2;}if(input == 'C'){ return 3;}//或者switch(input){ case 'A': console.log(1); break; case 'B': console.log(2); break; case 'C': console.log(3); break;}
对于这种有多个if-else和switch语句的情况,可以使用策略模式来处理。
策略模式有两部分组成:一、策略类:封装了具体的算法,并负责具体计算过程。二、环境类:接受客户的请求,然后将请求委托给某个策略类//策略类Strategyvar strategies = { "A": function(num){ return 1 + num; }, "B": function(num){ return 2 + num; }, "C": function(num){ return 3 + num; }};//环境类Contextvar calculate = function(level,num){ return strategies[level](num);};//调用result = calculate('A',10);
表单校验:
一般写法:function checkForm(){ if($("#name").val()==''){ alert('用户名不能为空!'); return false; } if($("#password").val().length<6){ alert('密码长度不能少于6位!'); return false; } if(!/(^1[3|5|8][0-9]{9}$)/.test($("#phone").val())){ alert('手机号格式不正确!'); return false; }}
使用“策略模式”:
/***********************策略对象Strategy***********************/var strategise={ isEmpty: function(value,errorMsg){ if(value === ''){ return errorMsg; } }, minLength: function (value,length,errorMsg) { if(value.length
优点:
1、采用组合、委托和多态等技术和思想,有效地避免多重条件选择语句。2、对“开放封闭原则”完美支持,将算法独立封装在strategy,使得它们易于切换、理解和扩展。3、策略模式中的算法也可以复用在系统的其他地方,从而避免重复的复制粘贴工作。4、利用组合和委托让Context拥有执行算法的能力,这也是继承的一种轻便替代方案。