设计模式之——策略模式
✨文章摘要(AI生成)
本文详细介绍了策略模式的概念、原理和实际应用。策略模式作为一种行为型设计模式,通过将对象和行为分离,实现了算法的灵活切换。文章通过结构图解释了策略模式的核心组成,并以电商支付方式和复杂条件判断优化为例,展示了策略模式在实际开发中的应用场景。特别介绍了使用 Map 数据结构来替代复杂的 if/else 逻辑,提供了更清晰、可维护的代码组织方式。
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口
和 具体行为的实现
。
原理
策略模式最大的特点是行为的变化,行为之间可以相互替换。
每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。
结构
- Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
- Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
适用场景
电商网站支付
- 电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式。
使用策略模式代替复杂的if / else
使用Map数据类型将逻辑以显式声明方式的进行描述,方便后续维护及改动,这样写的好处是逻辑直观清晰,可以轻松地添加或修改策略
ts// bad if(A) { //... if(C) { // .... }else if (E) {....} }else if (B) { //... if(D) { // .... }else if (F) {....} } // good const strategies = new Map([ [{ A, C }, () => { ... }] , [{ A, E }, () => { ... }] , [{ B, D }, () => { ... }] , [{ B, F }, () => { ... }] , ]); // 由于key是引用类型,所以这里需要对传入的策略进行序列化 function execute(strategy) { if (strategies.has(JSON.stringify(strategy))) return strategies.get(strategy)(); throw new Error(Strategy not found.); }