Malize's blog Malize's blog
首页
  • 设计模式

    • 设计模式总览
    • 工作中用到的设计模式
  • 并发编程

    • 死锁
  • 技术文档

    • Docker 核心命令大全
    • Markdown 使用教程
    • npm 常用命令
    • yaml 语言教程
    • Nodejs 递归读文件
  • 构造问答系统

    • 项目背景
    • 构建答疑机器人
    • 扩展知识范围
    • 优化提示词
    • 自动化评测
    • 优化 RAG 应用
  • 构建 Agent 系统

    • Agent 基础与工具调用
    • 规划与执行
    • 多 Agent 团队协作
    • Memory 积累经验
    • Skill 可复用流程
    • Qwen Code 实践
  • 交付上线

    • 走向生产环境
    • 模型蒸馏
    • 部署模型
    • 生产实践
    • 安全合规
  • 工具手册

    • OpenClaw 命令速查
  • 规范 & 实践

    • 代码规范
    • sharding-jdbc
    • CIM 半导体行业
    • HTML 常用 meta
    • CSS 技巧收藏
  • 微服务

    • feign原理
  • Git

    • Git 笔记总览
    • Git 使用手册
    • Git 修改分支名
    • 团队 Git 分支规范
  • GitHub & 博客

    • GitHub 高级搜索技巧
    • GitHub Actions 自动部署
    • 博客搭建 - 百度收录
  • 优质网站
  • 前端库推荐
  • 成长学习

    • 学习方法
    • 敏捷开发实战
    • 提示词工程
  • 生活

    • 实用技巧
    • 心情杂货
    • 梦境与灵感
  • 技术问题

    • 面试问题备忘
  • 索引

    • 分类
    • 标签
    • 按年归档
GitHub (opens new window)

Malize

持续学习,持续成长
首页
  • 设计模式

    • 设计模式总览
    • 工作中用到的设计模式
  • 并发编程

    • 死锁
  • 技术文档

    • Docker 核心命令大全
    • Markdown 使用教程
    • npm 常用命令
    • yaml 语言教程
    • Nodejs 递归读文件
  • 构造问答系统

    • 项目背景
    • 构建答疑机器人
    • 扩展知识范围
    • 优化提示词
    • 自动化评测
    • 优化 RAG 应用
  • 构建 Agent 系统

    • Agent 基础与工具调用
    • 规划与执行
    • 多 Agent 团队协作
    • Memory 积累经验
    • Skill 可复用流程
    • Qwen Code 实践
  • 交付上线

    • 走向生产环境
    • 模型蒸馏
    • 部署模型
    • 生产实践
    • 安全合规
  • 工具手册

    • OpenClaw 命令速查
  • 规范 & 实践

    • 代码规范
    • sharding-jdbc
    • CIM 半导体行业
    • HTML 常用 meta
    • CSS 技巧收藏
  • 微服务

    • feign原理
  • Git

    • Git 笔记总览
    • Git 使用手册
    • Git 修改分支名
    • 团队 Git 分支规范
  • GitHub & 博客

    • GitHub 高级搜索技巧
    • GitHub Actions 自动部署
    • 博客搭建 - 百度收录
  • 优质网站
  • 前端库推荐
  • 成长学习

    • 学习方法
    • 敏捷开发实战
    • 提示词工程
  • 生活

    • 实用技巧
    • 心情杂货
    • 梦境与灵感
  • 技术问题

    • 面试问题备忘
  • 索引

    • 分类
    • 标签
    • 按年归档
GitHub (opens new window)
  • 工作中用到的设计模式
  • 享元模式
  • 单例模式
  • 原型模式
  • 备忘录模式
  • 外观模式
  • 工厂方法模式
  • 模板方法模式
  • 策略模式
    • 装饰模式
    • 访问者模式
    • 责任链模式
    • 适配器模式
    • 中介者模式
    • 设计模式
    malize
    2020-11-18
    目录

    策略模式原创

    # 策略模式

    # 一、策略模式

    1. 原理:策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

    2. 优缺点

      1. 1 优点
      • 符合开闭原则:可以在不修改原有代码的情况下增加新的策略算法,实现了对扩展开放,对修改封闭。
      • 消除条件语句:将算法的实现分离成独立的策略类,避免了在客户端代码中使用大量的条件语句(如 if-else 或 switch-case)。
      • 提高代码复用性:不同的策略可以被不同的客户端重复使用,减少了代码的重复。
      • 提高算法的可维护性:将复杂的算法逻辑封装在独立的策略类中,使得每个策略类的职责单一,便于维护和管理。
      • 提高代码的可读性:通过将不同的算法分开,实现了职责单一,使得代码更加清晰易懂。
      1. 2 缺点
      • 增加类的数量:每一个具体策略都是一个新的类,可能会导致类的数量大幅增加,增加了系统的复杂性。
      • 客户端必须了解所有策略:客户端需要知道所有的策略,并且需要自行选择合适的策略,这增加了客户端的复杂度。
      • 策略切换成本:如果需要动态地在策略之间切换,可能会增加一定的运行时开销,并且需要额外的逻辑来管理这些切换。
      • 策略类可能会被滥用:如果策略类过多,可能会导致设计的混乱,使得系统变得难以理解和维护。
    3. 适用场景

      • 需要在不同情况下使用不同的算法:例如,排序算法在不同的数据规模或数据分布情况下可能会有不同的选择。
      • 算法的实现细节对客户端透明:客户端只需要知道策略接口,而不需要关心具体的实现细节。
      • 算法有多种实现方式,且这些实现可能会频繁变化:例如,不同的压缩算法、不同的日志记录策略等。

    # 二、策略模式基本代码

    1. 策略接口

      public interface Strategy {
          void execute(String data);
      }
      
      1
      2
      3
    2. 具体策略类A,B

      public class ConcreteStrategyA implements Strategy {
          @Override
          public void execute(String data) {
              System.out.println("Algorithm A processing " + data);
          }
      }
      
      public class ConcreteStrategyB implements Strategy {
          @Override
          public void execute(String data) {
              System.out.println("Algorithm B processing " + data);
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
    3. 上下文类

      public class Context {
          private Strategy strategy;
      
          public Context(Strategy strategy) {
              this.strategy = strategy;
          }
      
          public void setStrategy(Strategy strategy) {
              this.strategy = strategy;
          }
      
          public void executeStrategy(String data) {
              strategy.execute(data);
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
    4. 客户端

      public class StrategyPatternDemo {
          public static void main(String[] args) {
              // 使用策略 A
              Context context = new Context(new ConcreteStrategyA());
              context.executeStrategy("data");
      
              // 切换到策略 B
              context.setStrategy(new ConcreteStrategyB());
              context.executeStrategy("data");
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11

    # 三、实现方式

    1. 从上下文类中找出修改频率较高的算法 (也可能是用于在运行时选择某个算法变体的复杂条件运算符)。

    2. 声明该算法所有变体的通用策略接口。

    3. 将算法逐一抽取到各自的类中, 它们都必须实现策略接口。

    4. 在上下文类中添加一个成员变量用于保存对于策略对象的引用。 然后提供设置器以修改该成员变量。 上下文仅可通过策略接口同策略对象进行交互, 如有需要还可定义一个接口来让策略访问其数据。

    5. 客户端必须将上下文类与相应策略进行关联, 使上下文可以预期的方式完成其主要工作。

    编辑 (opens new window)
    #重学Java设计模式
    模板方法模式
    装饰模式

    ← 模板方法模式 装饰模式→

    最近更新
    01
    feign原理
    07-15
    02
    团队Git分支管理、迭代发布、分批投产标准化规范
    07-15
    03
    面试问题备忘
    07-07
    更多文章>
    Theme by Vdoing | Copyright © 2023-2026 Malize | GitHub | 桂ICP备2024034950号 | 桂公网安备45142202000030
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式