设计模式的艺术-策略模式

devtools/2025/2/6 22:58:24/

行为型模式的名称、定义、学习难度和使用频率如下表所示:

1.如何理解策略模式

  1. 策略模式中,可以定义一些独立的类来封装不同的算法,每个类封装一种具体的算法。在这里,每个封装算法的类都可以称之为一种策略(Strategy)。为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做规则的定义,而每种算法则对应于一个具体策略类。

  2. 策略模式主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开。将算法的定义放在专门的策略类中,每个策略类封装了一种实现算法。使用算法的环境类针对抽象策略类进行编程,符合依赖倒转原则。在出现新的算法时,只需要增加一个新的实现了抽象策略类的具体策略类即可。

  3. 策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式

  4. 策略模式是一个比较容易理解和使用设计模式策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理策略模式通常把一个系列的算法封装到一系列具体策略类里面,作为抽象策略类的子类。

  5. 策略模式用于算法的自由切换和扩展,它是应用较为广泛的设计模式之一。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法来解决某一问题,同时可以方便地更换算法或者增加新的算法。只要涉及算法的封装、复用和切换都可以考虑使用策略模式

2.策略模式的优缺点

优点

  1. 解耦算法与客户端
  2. 提高代码复用性

  3. 符合单一职责原则、开闭原则

缺点

  1. 增加类的数量

  2. 性能开销:在运行时动态切换策略可能会引入一定的性能开销,尤其是在策略切换频繁的情况下。

  3. 过度设计:如果系统中只有少数几个固定的算法,使用策略模式可能会导致过度设计,增加不必要的复杂性。

3.策略模式的使用场景

  1. 当一个系统需要在多种算法或策略中进行选择时,例如一个电商平台的促销策略,可能有满减、折扣、赠品等不同的策略。

  2. 当算法或策略在未来可能会经常变化或扩展时。比如一个图像压缩程序,可能会支持不同的压缩算法,并且后续可能会添加新的算法。

  3. 当一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现。通过使用策略模式,可以将这些不同的行为封装成独立的策略类,消除复杂的条件判断。

以上内容为根据书本内容配合搜索引擎整理得来,目的是为了学习,要是有侵权的情况发生,请联系我,我会立即予以删除,谢谢!

一起成长,人生是马拉松,可以跑得慢,但一定要在路上。


http://www.ppmy.cn/devtools/156638.html

相关文章

PostgreSQL 数据库视图基础操作

视图是 PostgreSQL 中的一种虚拟表,通过一个或多个查询语句生成。视图不实际存储数据,而是存储了一个查询定义,每次查询视图时,都会执行这个查询定义。视图可以用于简化复杂的查询、隐藏某些列或行、实现数据聚合等。定义视图如下…

数据库课程设计使用Java+JDBC+MySQL+Swing实现的会议预约管理系统源代码+数据库

编码: GBK 开发环境 jdk12MySQL8.0 效果图 用户端 管理员端 完整代码下载地址:会议预约管理系统源代码数据库

项目配置的最常见文件格式(ini,toml,yaml,conf,json,env)

在编程中,有多种文件格式可用于处理项目配置,每种格式都有其特点,下面将详细比较常见的配置文件格式(INI、TOML、YAML、CONF、JSON、ENV)以及用于解析它们的 Python 库。 1. INI 文件格式 特点: 简单易读&…

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件,按照参…

STM32 PWM驱动直流电机

接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…

跨域问题解决实践

在软件开发中,经常会遇到跨域问题,这个问题比较头疼,今天主要介绍下遇到的跨域问题解决思路及如何解决? 1、首先是后端跨域问题 spring boot中的跨域配置如下: Configuration public class WebMvcConfig implements W…

【go语言】结构体

一、type 关键字的用法 在 go 语言中,type 关键字用于定义新的类型,他可以用来定义基础类型、结构体类型、接口类型、函数类型等。通过 type 关键字,我们可以为现有类型创建新的类型别名或者自定义新的类型。 1.1 类型别名 使用 type 可以为…

C32.【C++ Cont】静态实现双向链表及STL库的list

目录 1.知识回顾 2.静态实现演示图 3.静态实现代码 1.初始双向链表 2.头插 3.遍历链表 4.查找某个值 4.任意位置之后插入元素 5.任意位置之前插入元素 6.删除任意位置的元素 4.STL库的list 1.知识回顾 96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删 97.【C…