定义:将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端的变化而变化
废话不多说,先来个例子
// 例如要写一个计算两个数加减乘除的方法,会有人这么写 countnum(type, num1, num2) { if(type === 'add'){ return num1 + num2 } else if(type === 'subtract'){ return num1 - num2 } else if(type === 'multiply'){ return num1 * num2 } else { return num1 / num2 } } countnum('add', 9, 3) // 12 countnum('subtract', 9, 3) // 6 countnum('multiply', 9, 3) // 27 countnum('', 9, 3) // 3
上面的例子,一定会有人这么写的,你要说没有我也没办法(~ ̄▽ ̄)~,这样写首先不利于维护,其实也不好方便扩展
改进一下:
let countnum = { add(num1, num2) { return num1 + num2 }, subtract(num1, num2) { return num1 - num2 }, multiply(num1, num2) { return num1 * num2 }, divide(num1, num2) { return num1 / num2 }, } countnum.add(9, 3) // 12 countnum.subtract(9, 3) // 6 countnum.multiply(9, 3) // 27 countnum.divide(9, 3) // 3
上面的例子就可以看成是一个策略模式
now,现在有个需求,快要圣诞节,所以咧,超市中一部分商品8折出售,一部分9折出售,等到元旦还要搞大事,普通用户满100返30,vip用户满100返50,用策略模式来实现
// 定义一个策略对象 let pricecestrategy = function(){ // 内部算法对象 let strategy = { return30(price){ return price + parseint(price / 100) * 30 }, return50(price){ return price + parseint(price / 100) * 50 }, price80(price){ return price * 80 / 100 }, price90(price){ return price * 90 / 100 } } // 策略方法调用接口 return { strategyfunction(type, price) { return strategy[type] && strategy[type](price) }, // 添加算法 addstrategy(type, fn){ strategy[type] = fn } } }() pricecestrategy.strategyfunction('return30', 100) // 130 pricecestrategy.strategyfunction('return50', 100) // 150 pricecestrategy.strategyfunction('price80', 100) // 80 pricecestrategy.strategyfunction('price90', 100) // 90 // 添加一个算法 pricecestrategy.addstrategy('return70', (price) => { return price + parseint(price / 100) * 70 }) console.log(pricecestrategy.strategyfunction('return70', 100)) // 170
还有我们的表单验证也可以使用策略模式
// 定义一个策略对象 let inputstrategy = function(){ // 内部算法对象 let strategy = { notnull(value){ return /\s+/.test(value) ? '请输入内容' : '' }, number(value){ return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '' : '请输入数字' } } // 策略方法调用接口 return { check(type, value) { // 去除空白符 value = value.replace(/^\s+|\s+$/g, '') return strategy[type] && strategy[type](value) }, // 添加策略 addstrategy(type, fn){ strategy[type] = fn } } }() // 添加算法 inputstrategy.addstrategy('nickname', (value) => { return /^[a-za-z]\w{3,7}$/.test(value) ? '' : '请输入4-8为昵称' })
策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
如对本文有疑问, 点击进行留言回复!!
微信小程序wx.scanCode扫描条形码,偶尔出现条形码不正确导致查询失败
Android 入门第七讲01-数据存储(数据存储概述,文件存储(raw和asserts目录读写,data/data/包名目录读写,sdcard目录读写),SharedPreferences读写)
vue-axios系列:axios拦截器,配置请求头,配置请求参数
网友评论