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

【设计模式-策略】

定义

策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户端而变化,使得算法的变化不会影响到使用它的客户端。

UML图

在这里插入图片描述
角色

  • Strategy(策略接口):定义一个公共接口,所有具体策略类都需要实现这个接口。
  • ConcreteStrategy(具体策略类):实现策略接口,提供具体的算法或行为。
  • Context(上下文):持有一个策略对象的引用,允许客户端选择所需的策略并委托请求到具体策略对象。

工作流程

  1. 客户端创建一个上下文对象,并根据需要选择具体的策略。
  2. 上下文调用策略对象的方法来执行特定的算法。
  3. 客户端可以在运行时切换策略,实现灵活的行为变化。

代码

// 策略接口
interface Strategy {int doOperation(int num1, int num2);
}// 具体策略类:加法
class AddStrategy implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}// 具体策略类:减法
class SubtractStrategy implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}// 具体策略类:乘法
class MultiplyStrategy implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}// 上下文类
class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}// 测试策略模式
public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new AddStrategy());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context.setStrategy(new SubtractStrategy());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context.setStrategy(new MultiplyStrategy());System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

优点

  • 灵活性高:可以在运行时动态选择或更改算法,提高了系统的灵活性和可扩展性。
  • 易于扩展:增加新的策略只需实现策略接口,不需要修改现有的上下文代码,符合开闭原则。
  • 减少条件语句:通过将算法封装在策略类中,避免了大量的条件判断,使代码更加清晰易懂。

缺点

  • 客户端需要了解策略:客户端需要了解不同的策略和它们的使用方式,这可能增加复杂性。
  • 策略数量增多:每种算法需要一个策略类,可能导致类的数量增加,管理难度上升。

适用场景

  • 算法选择:需要根据不同的条件选择不同的算法,如排序、支付方式等。
  • 行为变化:如图形处理中的不同绘制行为、游戏中的不同角色行为。
  • 可插拔的算法:如日志记录系统中选择不同的记录方式(控制台、文件、数据库等)。

策略模式通过将算法封装在独立的策略类中,使得算法可以灵活变化,提高了代码的可读性和可维护性。

相关文章:

  • 网络编程,tcp,守护进程化,前后台任务,bash与shell,会话
  • CSS中的字体样式、文本样式、列表样式以及背景和渐变
  • 基于基于微信小程序的社区订餐系统
  • 滚雪球学MySQL[2.3讲]:MySQL数据过滤与排序详解:WHERE条件、ORDER BY排序与LIMIT分页查询
  • 计算机网络自顶向下(2)----socket编程
  • 高精度(4)——高精度除法
  • 【MySQL】复合查询
  • 【2.使用VBA自动填充Excel工作表】
  • leetcode每日一题day19(24.9.29)——买票需要的时间
  • sql 时间交集
  • Oracle 相关的工具使用 SQL Developer , sqlplus
  • 解决键盘弹起上抬顶部的问题,绑定手势问题
  • 【专题总结】【一文解决】C++多继承下的构造函数执行顺序
  • 计算机毕业设计 服装生产信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Python的异步编程
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • echarts的各种常用效果展示
  • If…else
  • java2019面试题北京
  • js学习笔记
  • JS专题之继承
  • Less 日常用法
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redux系列x:源码分析
  • vuex 笔记整理
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 使用agvtool更改app version/build
  • 使用Swoole加速Laravel(正式环境中)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 自制字幕遮挡器
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​批处理文件中的errorlevel用法
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (09)Hive——CTE 公共表达式
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言)fread与fwrite详解
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (第27天)Oracle 数据泵转换分区表
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十三)MipMap
  • (四)事件系统
  • (一)UDP基本编程步骤
  • ****Linux下Mysql的安装和配置
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET Core 2.1路线图
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net Memory Profiler的使用举例
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET/C# 使窗口永不获得焦点
  • .NET微信公众号开发-2.0创建自定义菜单