【设计模式】策略模式

策略模式是行为设计模式 ,核心思想是定义算法族,分别封装,并且他们可以互相替换。

该模式使得算法独立于客户端变化,解决了场景中多种算法策略交叉混杂的问题。

使用场景

  • 数据导出,需要导出为不同格式的数据(Excel、PDF、CSV等)
  • 数据计算,需要执行不同的计算公式(加减、乘除等)
  • 对接不同的数据库(mysql、pgsql等)

核心组件

  • 策略接口 :strategy interface

    • 定义算法的抽象协议

      public interface Strategy{
      void execute(Object obj);
      }

  • 策略实现类

    • 具体算法的实现类,每一个策略实现一种独立算法

      public class StringStrategy implements Strategy {
      @Override
      public void execute(Object obj) {
      System.out.println("String:" + obj);
      }
      }

      public class IntegerStrategy implements Strategy {
      @Override
      public void execute(Object obj) {
      System.out.println("Integer:" + obj);
      }
      }

  • 上下文类 :Context

    • 执行相关策略,将客户端和策略进行解耦

      public class StrategyContext {
      private Strategy strategy;

      复制代码
      public void setStrategy(Strategy strategy) {
          this.strategy = strategy;
      }
      
      public void execute(Object obj) {
          strategy.execute(obj);
      }

      }

类图

  • Application:调用类

  • StrategyContext:上下文类

  • Strategy:抽象类

  • StringStrategy:实现类

    public interface Strategy {

    复制代码
      void execute(Object obj);  

    }

    public class StringStrategy implements Strategy {
    @Override
    public void execute(Object obj) {
    System.out.println("String:" + obj);
    }
    }

    public class StrategyContext {

    复制代码
      private Strategy strategy;  
    
      public void setStrategy(Strategy strategy) {  
          this.strategy = strategy;  
      }  
    
      public void execute(Object obj) {  
          strategy.execute(obj);  
      }  

    }

    public class Application {

    复制代码
      public static void main(String[] args) {  
          StrategyContext strategyContext = new StrategyContext();  
    
    
          strategyContext.setStrategy(new StringStrategy());  
          strategyContext.execute("StringStrategy");  
    
          strategyContext.setStrategy(new IntegerStrategy());  
          strategyContext.execute(66);  
      }  

    }

模式的优缺点

优点

  • 消除了大量的判定(if-else,switch-case),提高了代码可读性
  • 符合单一原则
  • 支持动态切换算法

缺点

  • 策略类可能无限增长
  • 客户端需要了解不同策略的区别

总结

策略模式将算法从业务逻辑中解耦出来,是消除条件表达式的重要模式,能够很好的提高可读性。建议与工厂模式进行组合使用。

相关推荐
码匠许师傅9 小时前
【设计模式精讲】7.建造者模式(Builder)
设计模式·建造者模式
码匠许师傅9 小时前
【设计模式精讲】6.抽象工厂(Abstract Factory)
c++·设计模式
workflower1 天前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路1 天前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅1 天前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木1 天前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf3 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质