目录
一、是什么
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个分支,并且分支处理的逻辑复杂
/*
希望对你有帮助!
如有错误,欢迎指正,谢谢!
*/