设计模式学习日记(1):策略模式

30 阅读2分钟

设计模式

策略模式是一种行为设计模式,定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)

定义:

一个问题匹配多个解决方案,不一定用到哪一个,而且可能还会随时继续增加多个方案

例子 购物车结算

我们有好多种折扣计算的方式

  • 满100 减 10
  • 满200 减 25
  • 8折
  • 7折

解决思路

  1. 把我们的多种方案,以闭包的形式保存起来
    • 按照传递进来的折扣和价格计算最终价格返回
  2. 留下添加折扣和删除折扣的接口
    • 函数也是一个对象,可以增加函数
    • 可以把函数名 当做成一个对象,向里面添加一个成员
    const calcPrice = (function (){
        const sale = {
            '100_10':function (price) {return price -= 10},
            '200_25':function (price) {return price -= 25},
            '80%': function(price) {return price *= 0.8}
        }
         //被 return 出去的函数,才是 calcPrice 本体
        function calcPrice(price,type){
            //判断对象里面有没有这个折扣类型
            //如果有,那么执行
            //如果没有,那么就告诉他没有这个折扣类型
            if(!sale[type]) return '没有这个折扣'
            // 找到sale 里面这顶的那个函数执行计算出结果,返回给外边
            return sale[type](price)
        }
        calcPrice.add = function (type,fn){
            //专门用来添加折扣
            //判断这个折扣是不是存在
            if(sale[type]) return '该折扣已存在'
            sale[type] = fn
            return '添加成功' 
        }
        calcPrice.delete = function (type){
            delete sale[type]
            return '删除成功'
        }
        //修改折扣
        //todo
        renturn calcPrice
    })()
    
    calcPrice(100,'100_10')
    //添加折扣
    calcPrice.add('75%',funciton(price){return price * 70%})
    const res = calcPrice(100,'75%')
    

image.png

学习总结

策略模式的出现主要的好处是通过对象的key 对应 fucntion 的方式减少了我们在项目中的if-else的使用,有些人可能会觉得这样写会更加麻烦,多很多函数出来,但是当我们遇到情况比较的多并且问题可变性大的时候他的好处就出来了,一方面是拆分后的代码可读性强,这就意味着更加容易维护,如果用if-else这会让当前这个函数代码很长,就不利于阅读。另一方面利用策略模式增加、修改、删除一个逻辑都要轻松很多,这是它比较好的方面。

实际项目中应该有很多场景的都会用到,当我们在写层层if-else时就应该考虑到。

特别在封装页面或者组件时,我们在设计得时候就应该多思考以下是否需要用到这种设计模式以及如何用比较好