Skip to content

设计模式之——策略模式

✨文章摘要(AI生成)

本文详细介绍了策略模式的概念、原理和实际应用。策略模式作为一种行为型设计模式,通过将对象和行为分离,实现了算法的灵活切换。文章通过结构图解释了策略模式的核心组成,并以电商支付方式和复杂条件判断优化为例,展示了策略模式在实际开发中的应用场景。特别介绍了使用 Map 数据结构来替代复杂的 if/else 逻辑,提供了更清晰、可维护的代码组织方式。

策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口具体行为的实现

原理

  • 策略模式最大的特点是行为的变化,行为之间可以相互替换。

  • 每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。

结构

企业微信截图_17149975429734

  • 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.);
      }

Last updated: