《论 · 前端设计模式之一:策略模式》

168 阅读1分钟

策略模式是一种简单却常用的设计模式,它的应用场景非常广泛。我们先了解下策略模式的概念,再通过代码示例来更清晰的认识它。

策略模式由两部分构成:一部分是封装不同策略的策略组,另一部分是 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>

GIF 2021-12-26 4-17-39.gif