设计模式——策略模式

目录

一、是什么

二、实现方式

三、应用场景

四、总结


一、是什么

1.当有多个分支选择并且这些分支没有必然联系 时,可以使用策略模式。减少代码中的 if-else,switch-case (租房:可以选择嘉禾望岗,也可以选择 万顷沙,也可以选择珠江新城)

二、实现方式

1.通过 对象属性定义函数的方式来实现

2.具体实现:

javascript 复制代码
/**
 * 策略模式
 * 定义: 用户自己决定使用哪种策略,策略之间没有必然联系
 * 实现方式: 对象+函数
 * 应用场景: 表单验证、支付方式选择、算法选择等 有多种相似方式可以选择时 
 * 优点: 简化if-else,switch-case,易维护,易扩展
 */
const  RentingStrategyType=Object.freeze({
  /**嘉禾望岗 */
  JIA_HE_WANG_GANG:1,
  /**万顷沙 */
  WAN_QING_SHA:2,
  /**珠江新城 */
  ZHU_JIANG_XIN_CHENG:3
})
class RentingStrategy{

  strategies={
    [RentingStrategyType.JIA_HE_WANG_GANG]: (money)=>{
      console.log('嘉禾望岗租金',money*0.5)
      return money*0.5 
    },
    [RentingStrategyType.WAN_QING_SHA]: (money)=>{
      console.log('万顷沙租金',money*0.8)
      return money*0.8
    },
    [RentingStrategyType.ZHU_JIANG_XIN_CHENG]: (money)=>{
      console.log('珠江新城租金',money*2)
      return money*2
    }
  }
  strategy=RentingStrategyType.JIA_HE_WANG_GANG

  /** 设置策略 */
  setStrategy(strategy){
    this.strategy=strategy
  }
  /** 执行策略 */
  execute({strategy,money}){
   if(strategy){
    this.setStrategy(strategy)
   }
    return this.strategies[this.strategy](money)
  } 
}
const rentingStrategy=new RentingStrategy()
rentingStrategy.execute({money:2500})
rentingStrategy.execute({money:2500,strategy:RentingStrategyType.WAN_QING_SHA})
rentingStrategy.execute({money:2500,strategy:RentingStrategyType.ZHU_JIANG_XIN_CHENG})

三、应用场景

有>=3种以上没有关联的分支选择,可以考虑使用策略模式,简化if-else、switch-case,易于以后新增其他选择。

四、总结

1.策略模式不同的策略单独实现对应的方案不使用if-else,switch-case耦合在一起。

2.实现方式:枚举+对象属性定义成函数或者class实例/对象

3.应用场景:>=3个分支,并且分支处理的逻辑复杂

/*

希望对你有帮助!

如有错误,欢迎指正,谢谢!

*/

相关推荐
geovindu5 小时前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
小王师傅666 小时前
【设计模式】装饰模式(三):从装饰模式看 Java 与面向对象设计(原理篇)
设计模式
Zane19949 小时前
从一次支付渠道扩展需求,看懂"多用组合少用继承"到底在说什么
设计模式
geovindu10 小时前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式
geovindu10 小时前
sql: Data Modeling Patterns using mysql
sql·mysql·设计模式·数据库开发
sarasuki1 天前
失败重试:Agent 中指数退避的正确姿势
人工智能·设计模式·agent
Zane19941 天前
为什么你写的 Java 代码"看着面向对象、实际是面向过程"?
设计模式
geovindu1 天前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
YHL3 天前
🎯 JavaScript 单例模式(Singleton Pattern)—— 从理论到实战
javascript·设计模式
2401_868534783 天前
网络环境规划核心考点全梳理
网络·设计模式