当前位置: 首页 > ai >正文

【设计模式】策略模式

策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端,从而实现算法的灵活切换。

一、策略模式的定义

策略模式的核心思想是将算法的定义和使用分离,通过接口或抽象类定义算法的公共接口,然后通过具体的实现类来实现不同的算法。客户端可以通过设置不同的策略来改变算法的行为。

二、策略模式的结构

策略模式主要包含以下几个角色:

• 策略接口(Strategy):定义了算法的公共接口,所有策略类都实现这个接口。

• 具体策略类(ConcreteStrategy):实现策略接口的具体算法类。

• 上下文类(Context):维护一个对策略对象的引用,提供一个接口来执行策略定义的算法。

三、策略模式的实现

以下是一个简单的实现示例:

1.策略接口

public interface Strategy {int doOperation(int num1, int num2);
}

2.具体策略类

public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}public class OperationSubtract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}public class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}

3.上下文类

public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}

4.客户端代码

public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

四、运行效果

运行上述代码后,输出如下:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

五、策略模式的优点

• 算法的可扩展性:

• 客户端可以根据需要选择不同的策略,而无需修改上下文类的代码。

• 算法的独立性:

• 每个策略类独立于其他策略类,便于维护和扩展。

• 避免条件语句:

• 策略模式可以避免使用大量的条件语句来选择算法,使代码更加清晰。

六、策略模式的缺点

• 策略类数量增加:

• 每个策略都需要一个具体的类,可能导致类的数量过多。

• 客户端需要了解策略类:

• 客户端需要知道所有策略类的存在,并根据需要选择合适的策略。

七、策略模式的应用场景

• 算法选择:

• 当需要在多种算法中选择一种时,策略模式可以方便地切换算法。

• 行为变化:

• 当对象的行为需要根据环境动态改变时,策略模式可以提供灵活的解决方案。

• 避免条件语句:

• 当需要避免使用大量的条件语句来选择算法时,策略模式可以简化代码。

八、总结

策略模式是一种非常实用的设计模式,通过将算法的定义和使用分离,实现了算法的灵活切换。通过合理使用策略模式,可以提高代码的可维护性和可扩展性,同时避免使用大量的条件语句。

static class Solution_20250529213945_9c7b947c55904f768bf8e1b88dcd86ba {static public interface Strategy {int doOperation(int num1, int num2);}static public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}}static public class OperationSubtract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}}static public class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}}static public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}}public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}}
http://www.xdnf.cn/news/9961.html

相关文章:

  • 【软件】在 macOS 上安装 MySQL
  • Python学习(5) ----- Python的JSON处理
  • 分布式存储技术全景解析:从架构演进到场景实践
  • 私有云大数据部署:从开发到生产(Docker、K8s、HDFS/Flink on K8s)
  • docker部署ELK,ES开启安全认证
  • 基于RK3568/RK3588/全志H3/飞腾芯片/音视频通话程序/语音对讲/视频对讲/实时性好/极低延迟
  • 深入链表剖析:从原理到 C 语言实现,涵盖单向、双向及循环链表全解析
  • vue3 项目配置多语言支持,如何从服务端拿多语言配置
  • 智能柜I立控信息I产品介绍
  • ArcGIS Pro 3.4 二次开发 - 布局
  • Spring Boot 应用中实现配置文件敏感信息加密解密方案
  • 通义灵码2.5——基于编程智能体开发Wiki多功能搜索引擎
  • 【软件】navicat 官方免费版
  • Flutter 嵌套H5 传参数
  • 生成式人工智能:重塑社会的双刃剑与人类文明的抉择
  • 技术创新如何赋能音视频直播行业?
  • IM系统的负载均衡
  • windows无法安装到这个磁盘,选中的磁盘采用gpt分区仪式
  • C++项目中使用CMake编译
  • WPF响应式UI的基础:INotifyPropertyChanged
  • OpenWebUI(1)源码学习构建
  • 公链地址生成曲线和算法
  • spring-boot redis lua脚本实现滑动窗口限流
  • 如何以 9 种方式将照片从 iPhone 传输到笔记本电脑
  • python打卡day40
  • STM32 搭配 嵌入式SD卡在智能皮电手环中的应用全景评测
  • 30V/150A MOSFET 150N03在无人机驱动动力系统中的性能边界与热设计挑战
  • 鸿蒙 HarmonyOS - SideBarContainer 组件自学指南
  • OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比
  • RCU初步分析