策略模式
策略模式作为一种软件设计模式,指对象的某个行为,在不同场景中,该行为有不同的实现算法.
-
图例
image.png
-
代码示例
class Tickets{
constructor(kind){
this.kind=kind
}
pay(money){
return this.kind.pay(money)
}
}
class EightyAbove{
pay(money){
return money*.3
}
}
class EightyToElevent{
pay(money){
return money
}
}
class TenUnder{
pay(money){
return money*.5
}
}
let tickets=new Tickets(new EightyAbove())
console.log(tickets.pay(100)) //30
tickets.kind=new EightyToElevent()
console.log(tickets.pay(100)) //100
- 策略模式另一种实现
class Tickets{
constructor(){
this.kind={
eightyAbove:(money)=>{
return money*.3
},
eightyToElevent:(money)=>{
return money
},
tenUnder:(money)=>{
return money*.5
}
}
}
pay(type,money){
return this.kind[type](money)
}
}
let tickets=new Tickets()
console.log(tickets.pay('eightyAbove',100)) //30
console.log(tickets.pay('eightyToElevent',100)) //100
- 应用场景
1.表单校验
<form id="registerForm">
请输入用户名:<input type="text" name="userName"><br>
请输入密码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
<script>
let form=document.getElementById('registerForm');
let validator=(function(){
let rules={
noEmpty(val,msg){
if(val=='') return msg
},
minLength(val,msg){
if(val==''||val<6) return msg
},
maxLength(val,msg){
if(val==''||val>10) return msg
}
}
let checks=[]
//增加校验的项目
function add(element,rule){
checks.push(function(){
let val=element.value
let name=rule.shift()
rule.unshift(val)
return rules[name] &&rules[name].apply(element,rule)
})
}
function start(){
for(let i=0;i<checks.length;i++){
let check=checks[i];
let msg=check()
console.log(msg)
if(msg) return msg
}
}
return {
add,
start
}
})()
form.onsubmit=function(){
validator.add(form.userName,['noEmpty','用户名不能为空'])
validator.add(form.password,['minLength','密码长度不能小于6位'])
validator.add(form.password,['maxLength','密码长度不能小于10位'])
let msg=validator.start()
if(msg){
alert(msg)
return false
}
return true
}
</script>
优点 |
---|
1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。 |
2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。 |
3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。 |
网友评论