概念
策略模式就是把用于实现同一目标的不同算法、规则封装起来,并使它们可以被相互替换的做法。
它提供了对开放封闭原则的完美支持,可以有效避免多重条件判断语句。
像下面这个“根据状态值获取对应文本”的函数,就有策略模式的影子。
function getStatusText(value){
return {
"Y":"已完成",
"N":"已取消",
"C":"待确认"
}[value]:"状态未明"
}
实践
应用“策略模式”对表单验证的代码进行重构。
- 新增一个Validate类
// 设计模式之策略模式--表单验证类
class Validate {
constructor () {
this.validateFuncs = []
}
add (value, rule, errorMsg) {
this.validateFuncs.push(() => {
// 获取对应策略的处理函数
return this._strategies[rule](value, errorMsg)
})
}
check () {
const validateFuncs = this.validateFuncs
let result = true
for (let i = 0, len = validateFuncs.length; i < len; i++) {
const errorMsg = (() => validateFuncs[i]())()
if (errorMsg) {
this.$toast(errorMsg)
result = false
break
}
}
return result
}
// 策略
_strategies = {
isNotEmpty (value, errorMsg) {
const trimedValue = typeof value === 'string' ? value.trim() : value
if (trimedValue === '' || trimedValue === 0) {
return errorMsg
}
},
isNotLessThan (value, errorMsg) {
const [num1, num2] = value
if (num1 < num2) {
return errorMsg
}
}
}
}
export default Validate
- 使用前代码
onSubmit() {
if (!this.payAmount) {
this.$toast("请输入购买金额")
return
}
if (this.payAmount > this.detail.baseAmt) {
this.$toast("购买金额不能小于起存金额")
return
}
...
}
- 使用后
onSubmit() {
const validate = new Validate()
validate.add(this.payAmount, 'isNotEmpty', '请输入购买金额')
validate.add([this.payAmount, this.detail.baseAmt], 'isNotLessThan', '购买金额不能小于起存金额')
...
if (!validate.check()) {
return
}
}
它的优点是通过取代大段ifelse语句,提升了代码可读性;通过封装变化(校验规则),提升了代码重用性和扩展性。缺点也有,就是我们在使用前需要了解已有策略,这违反了最少知识原则,但可以接受。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!