策略模式是一种简单却常用的设计模式,它的应用场景非常广泛。我们先了解下策略模式的概念,再通过代码示例来更清晰的认识它。
策略模式由两部分构成:一部分是封装不同策略的策略组,另一部分是 Context。通过组合和委托来让 Context 拥有执行策略的能力,从而实现可复用、可扩展和可维护,并且避免大量复制粘贴的工作。
接下来我们就通过一个简单的例子了解一下:
<script>
//人: '蟹老板' - '海绵宝宝' - '章鱼哥'
const XBW = (()=>{ //先开个店,名字叫蟹堡王
let members = { '0' : '普通会员' , '1' : '白银会员' , '2' : '黄金会员' , '3' : '至尊会员' }
let foods = { '汉堡' : 20, '薯条' : 30, '可乐' : 40, '爆米花' : 50 , '花卷' : 60}
let list = {}
let activity = { //蟹老板说了,为了庆祝圣诞节,这是蟹堡王的今年的圣诞节优惠活动清单
'0' : (price) => { return price -= 5 }, // 普通会员可优惠5元
'1' : (price) => { return price -= 10 }, // 白银会员可优惠10元
'2' : (price) => { return price -= 15 }, // 黄金会员可优惠15元
'3' : (price) => { return price -= 20 }, // 至尊会员可优惠20元
}
class XBW{
constructor(members,foods,list,activity){
this.eligibility = members,
this.activity = activity,
this.list = list,
this.foods = foods
}
addMember(PersonName){ //添加会员
this.list[PersonName] = String(Math.round(Math.random()*(3-0)+0));
}
MemberComputed(PersonName,price,food){ //计算有会员
return this.activity[this.list[PersonName]](price) - this.foods[food]
}
NoMemberComputed(price,food){ //计算无会员
// return this.foods[foods] - price
return price - this.foods[food]
}
identity(name){ //会员信息
let data = String(this.list[name])
return this.eligibility[data]
}
}
let XAJ = new XBW(members,foods,list,activity)
return function HMBB(PersonName,food,price){ //蟹堡王一开店,蟹老板就将这个事情安排给了海绵宝宝处理
if(!XAJ.foods.hasOwnProperty(food)) return alert('没有你要的食物哦' + PersonName) //没有该食物就打回
if(price < XAJ.foods[food]) return alert('钱不够啊回去再拿点钱哈' + PersonName) //钱不够也打回
if(!XAJ.list.hasOwnProperty(PersonName)){ //没有会员记录
if(confirm(PersonName + '今天圣诞节有优惠噢,你要充会员吗')){
XAJ.addMember(PersonName) //添加会员
alert('会员充值成功!! ' + PersonName + ' 你现在是尊贵的' + XAJ.identity(PersonName))
return XAJ.MemberComputed(PersonName,price,food) + '这是您打折的零钱'
}
return XAJ.NoMemberComputed(price,food) + '这是您没打折计算后的零钱'
}
return XAJ.MemberComputed(PersonName,price,food) + '这是您打折的零钱'
}
})()
</script>