设计模式之策略模式

概念

策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),属于行为型设计模式。它是指定义了不同的算法逻辑,并将其封装起来,让它们之间可以互相替换,此模式可以让算法逻辑发生变化时不会影响到使用算法逻辑的用户。

策略模式可以用于改造代码中的if...else逻辑。

使用场景

同一个系统中存在不同的逻辑算法,而彼此之间在不同场景中需要实现动态替换。

  • 一个人的交税比率与他的工资有关,不同工资对应不同的税率
  • 根据绩效发放年终奖金,绩效分A B C等级,根据不同的等级发放多或少的奖金
  • 互联网移动支付,每次下单后付款都需要选择支付方式
  • 商场打折促销活动,有双11活动,双12活动,彼此之间可以相互替换
  • 旅行采用的不同的交通工具,飞机,高铁,动车,汽车,火车等等
  • form 表单验证,对每一个输入框进行验证,可以验证是否为空,最小长度,是否符合电话号码等等

策略模式示例

发放奖金规则:绩效得A的员工,将拿到原本工资*3倍的钱;绩效得B的员工,将拿到原本工资*2倍的钱;绩效得C的员工,将拿到原本工资*1.5倍的钱。

我们通常这样写

javascript 复制代码
// original:原本的工资  grade:绩效等级
function calcSalary(original, grade) { 
     let final;
     if (grade === "A") {
         final = original * 3
     } else if (grade === "B") {
         final = original * 2
     } else if (grade === "C") {
         final = original * 1.5
     }
     return final
 }
console.log(calcSalary(2000,'A')) 
// 6000
console.log(calcSalary(2000,'B')) 
//4000
console.log(calcSalary(2000,'C')) 
//3000

使用策略模式重构代码

再回顾一遍策略模式的定义:定义一系列算法,把它们一个个封装起来,并且它们可以相互替换

我们可以观察在计算绩效奖金的过程中,算法的使用方式是不变的,都是根据某个算法取得计算后的奖金数额。而算法的实现是各异和变化的,每种绩效对应着不同的计算规则。一个基于策略模式的程序至少由两部分组成,一组策略一个调用环境。接下来看一下具体实现:

javascript 复制代码
//一组策略
var strategies = { 
    "A": function(original) {
        return original * 3
    },
    "B": function(original) {
        return original * 2
    },
    "C": function(original) {
        return original * 1.5
    }
}

// 创建一个调用环境
function calcSalary(original, grade) { 
    return strategies[grade](original)
}

console.log(calcSalary(2000,'A')) 
// 6000
console.log(calcSalary(2000,'B')) 
// 4000
console.log(calcSalary(2000,'C')) 
// 3000
相关推荐
善良勤劳勇敢而又聪明的老杨1 天前
【AI编程系列】MCP 常用设计模式解读
设计模式·ai编程
geovindu1 天前
java: Strategy Pattern
java·开发语言·后端·设计模式·策略模式·行为模式
码匠许师傅1 天前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
geovindu2 天前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
geovindu2 天前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
YHHLAI2 天前
NestJS 后端开发实战:从设计模式到 CRUD 全栈
设计模式
2401_868534783 天前
长远目标 Long-term Goal 老题沿用
设计模式·需求分析
吃饱了得干活3 天前
Java设计模式实战:一个支付模块的重构之旅,层层递进理解设计模式精髓
后端·设计模式·架构
vivo互联网技术3 天前
软件不是从数据开始,而是从现实开始 | KDC 系列 01
设计模式·架构·领域驱动设计
码匠许师傅3 天前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式