定義
定義一系列算法, 把他們一個個封裝起來,并且能夠相互替換。將不變的部分和變化的部分隔開是每個設計模式的主題,策略模式的目的就是將算法的使用與算法的實現分離開來
策略模式實現表單驗證
<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 。