(设计模式)7.策略模式

177 阅读2分钟

说明:继续学习努力
PS:学习自---掘金的JavaScript设计模式核心原理与应用小册

一、概念

定义一系列的算法,把它们一个个封装起来,并且使他们可相互替换

二、案例

代码+需求说明

  • 1.案例说明 某电商平台设置不同会员等级购买东西 折扣不一样
    青铜会员 原价
    白银会员 九折
    黄金会员 八折
    铂金会员 七折
    钻石会员 六折
    王者会员 五折

  • 2.开发思路 1.用户发送请求获取用户信息 获取到会员等级
    2.会员等级参数传递给计算价格的方法,选择计算的规则
    3.根据计算规则获取商品总价

  • 3.初级写法 v1.0

// @params degree 会员等级  originPrice 原商品总价
function calculateTotal(degree, originPrice){
    if (degree === 'bronze') {
        return originPrice * 1;
    }
    if (degree === 'silver') {
        return originPrice * 0.9;
    }
    if (degree === 'gold') {
        return originPrice * 0.8;
    }
    if (degree === 'platnum') {
        return originPrice * 0.7;
    }
    if (degree === 'diamond') {
        return originPrice * 0.6;
    }
    if (degree === 'challenger') {
        return originPrice * 0.5;
    }
}

// 调用计算等级 
const totalPrice = calculateTotal('diamond', 1000);
console.log(totalPrice); // 600
  • 4.单一原则 将每个等级计算规则独立出来 v2.0
// 青铜
function bronze(originPrice) {
    return originPrice * 1;
}
// 白银
function silver(originPrice) {
    return originPrice * 0.9;
}
// 黄金
function gold(originPrice) {
    return originPrice * 0.8;
}
// 铂金
function platnum(originPrice) {
    return originPrice * 0.7;
}
// 钻石
function diamond(originPrice) {
    return originPrice * 0.6;
}
// 王者
function challenger(originPrice) {
    return originPrice * 0.5;
}
function calculateTotal(degree, originPrice){
    if (degree === 'bronze') {
        return bronze(originPrice);
    }
    if (degree === 'silver') {
        return silver(originPrice);
    }
    if (degree === 'gold') {
        return gold(originPrice);
    }
    if (degree === 'platnum') {
        return platnum(originPrice);
    }
    if (degree === 'diamond') {
        return diamond(originPrice);
    }
    if (degree === 'challenger') {
        return challenger(originPrice);
    }
}

  • 5.验证单一原则,这里我们有些会员等级开放促销 v3.0 例如 钻石会员我们可以添加 先满3000 - 500 然后再进行打折
// 修改对应的钻石会员逻辑
function diamond(originPrice) {
    if(originPrice > 3000) {
        return (originPrice - 500) * 0.6;
    }
    return originPrice * 0.6;
}
  • 6.完成开放封闭原则 v4.0
// 对象映射
const degreeProcessor = {  // 等级处理
    bronze(originPrice) { // 青铜
        return originPrice * 1;
    },
    silver(originPrice) { // 白银
        return originPrice * 0.9;
    },
    gold(originPrice) { // 黄金
        return originPrice * 0.8;
    },
    platnum(originPrice) {  // 铂金
        return originPrice * 0.7;
    },
    diamond(originPrice) {  // 钻石
        if(originPrice > 3000) {
            return (originPrice - 500) * 0.6;
        }
        return originPrice * 0.6;
    },
    challenger(originPrice) {  // 王者
        return originPrice * 0.5;
    }
}
const total = degreeProcessor['diamond'](4000)
console.log(total);   // 2100
  • 7.添加新的会员等级 黑铁(需给服务费20) v5.0
degreeProcessor.blackIron = function(originPrice) {
    return originPrice + 20;
}
const ironPrice = degreeProcessor['blackIron'](1000)
console.log(ironPrice)   // 1020

这样子我们构建的代码就完成了