策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端变化而变化。
其实策略模式在我们生活中可应用的地方还是比较多的,比如在商城搞促销的时候,会有很多打折的情况比如5折呀,7折呀,还会有各种返利,比如满200-100这类的活动,这种场景,我们的策略模式就可以应用上去
- //创建折扣策略对象
- var DiscountStrategy = function() {
- //创建内部算法对象
- var stragtegy = {
- rebate30: function(price) {
- return price - parseInt(price / 100) * 30;
- },
- rebate50: function(price) {
- return price - parseInt(price / 100) * 50;
- },
- discount90: function(price) {
- return price * 100 * 90 / 10000
- },
- discount80: function(price) {
- return price * 100 * 80 / 10000
- },
- discount50: function(price) {
- return price * 100 * 50 / 10000
- }
- }
- //策略算法调用接口
- return {
- returnPrice: function(algorithm, price) {
- return stragtegy[algorithm] && stragtegy[algorithm](price);
- },
- ,
- //添加策略
- addStrategy: function(type, fn) {
- stragtegy[type] = fn;
- }
- }
- } ();
我们看一下具体的调用,另外我们之前添加了拓展策略的方法,我们一并测试下
- var price = DiscountStrategy.returnPrice('discount50', '210');
- console.log(price);
- //添加新策略
- DiscountStrategy.addStrategy('discount70',
- function(price) {
- return price * 100 * 70 / 10000
- }) price = DiscountStrategy.returnPrice('discount70', '210');
- console.log(price);
从结构上看,策略模式和状态模式很像,也是在内部封装一个对象,然后通过返回的接口对象实现对内部对象的调用,但是策略模式不需要管理状态、状态间没有依赖关系。策略之间可以相互替换、在策略对象内部保存的是相互独立的一些算法。
让我们再看一个我们实际场景可以应用的验证例子
- //表单正则验证策略对象
- var checkInput = function() {
- var stragtegy = {
- //判断是否为空
- notNull: function(value) {
- return /\s/.test(value) ? '请输入内容': '';
- },
- //判断是否为一个数字
- number: function(value) {
- return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '': '请输入数字'
- }
- }
- return {
- //验证接口
- check: function(type, value) {
- value = value.replace(/^\s+|\s+$/g, '');
- return stragtegy[type] ? stragtegy[type](value) : '没有该类型的检测方法'
- },
- //添加策略
- addStrategy: function(type, fn) {
- stragtegy[type] = fn;
- }
- }
- } ();
同样的我们调用测试下
- console.log(checkInput.check('number', 'a'));
- console.log(checkInput.check('number', '0'));
- checkInput.addStrategy('phone',
- function(value) {
- return /^\d{3}\-\d{8}$|^\d{4}-\d{7}$/.test(value) ? '': '请输入正确的电话号码';
- }) console.log(checkInput.check('phone', '12345678'));
- console.log(checkInput.check('phone', '027-12345678'));
策略模式最主要的特点是创建一系列策略算法,没组算法处理的业务都是相同的,只是处理的过程或者处理的结果不一样,所以它们又是可以相互替换的,这样就解决了算法与使用者之间的耦合。在测试层面上讲,由于每组算法相互之间的独立性,该模式更方便与每组算法进行单元测试保证算法的质量。
策略模式的优点
来源: http://www.cnblogs.com/chen-jie/p/JavaScript-Strategy.html