定义
定义一系列算法, 把他们一个个封装起来,并且能够相互替换。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式的目的就是将算法的使用与算法的实现分离开来
策略模式实现表单验证
<form action="http:// xxx.com/register" id="registerForm" method="post">
请输入用户名:<input type="text" name="userName"/ >
请输入密码:<input type="text" name="password"/ >
请输入手机号码:<input type="text" name="phoneNumber"/ >
<button>提交</button>
</form>
...
<script type="text/javascript">
var registerForm = document.getElementById('registerForm');
var strategies = {
'isNotEmpty': function (val, error) {
if (val == "") {
this.focus();
return error;
}
},
'minLength': function (val, error, length) {
if (val.length < length) {
this.focus();
return error;
}
},
'isMobile': function (val, error) {
if (!/(^1[3|5|8][0-9]{9}$)/.test(val)) {
this.focus();
return error;
}
}
};
var validataFn = function () {
var validator = new Validator();
/*添加规则*/
validator.add( registerForm.userName, [{
strategy: 'isNotEmpty',
errorMsg: '用户名不能为空'
}, {
strategy: 'minLength:6',
errorMsg: '用户名长度不能小于 10 位'
}]
);
var errMsg = validator.start();
return errMsg;
}
function Validator () {
this.cache = [];
}
/**
* @params: dom表示表单元素,rule: {strategy: 验证规则, errMsg: 错误信息}
* 用于将验证函数添加到数组中
*/
Validator.prototype.add = function (dom, rule) {
var self = this;
rule.map(function (val, n) {
var arrs = [];
arrs = val.strategy.split(':');
var strategy = arrs.shift();
arrs.unshift(val.errorMsg);
arrs.unshift(dom.value);
self.cache.push(function(){
return strategies[strategy].apply(dom, arrs);
});
})
}
/**
* 用于返回第一个验证的错误信息
*/
Validator.prototype.start = function () {
console.log(this.cache[1]());
for (var i = 0, fn; fn = this.cache[i++];) {
var err = fn();
if(err) {
return err;
}
}
}
registerForm.onsubmit = function () {
var err = validataFn();
if (err) {
alert(err);
}
return false;
}
</script>
策略模式的优缺点
优点
- 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句
- 策略模式提供了对开放 — 封闭原则的完美支持,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展
- 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。
- 在策略模式中利用组合和委托来让 Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案
缺点
使用策略模式会在程序中增加许多策略类或者策略对象。其次,要使用策略模式,必须了解所有的 strategy ,必须了解各个 strategy 之间的不同点,
这样才能选择一个合适的 strategy 。