软件设计模式与体系结构-设计模式-行为型软件设计模式-策略模式

news2024/11/14 14:57:44

目录

  • 四、策略模式
    • 类图
    • 代码
    • 实例
    • 使用策略模式对中国的十二属相(Chinese Zodiac)设计查询系统。
    • 策略模式与状态模式
    • 课程作业

四、策略模式

在这里插入图片描述
在这里插入图片描述

类图

在这里插入图片描述

代码

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

下面是一个使用策略模式的简单代码示例,以解释其工作原理:

# 定义策略接口
class Strategy:
    def execute(self):
        pass

# 具体策略类A
class ConcreteStrategyA(Strategy):
    def execute(self):
        print("Executing strategy A")

# 具体策略类B
class ConcreteStrategyB(Strategy):
    def execute(self):
        print("Executing strategy B")

# 上下文类
class Context:
    def __init__(self, strategy):
        self._strategy = strategy
    
    def set_strategy(self, strategy):
        self._strategy = strategy
    
    def execute_strategy(self):
        self._strategy.execute()

# 示例代码
# 创建具体策略对象
strategyA = ConcreteStrategyA()
strategyB = ConcreteStrategyB()

# 创建上下文对象并设置具体策略对象A
context = Context(strategyA)

# 执行策略
context.execute_strategy()  # 输出:Executing strategy A

# 切换策略为具体策略对象B
context.set_strategy(strategyB)
context.execute_strategy()  # 输出:Executing strategy B

在上述示例中,策略模式包含以下几个角色:

  • Strategy:策略接口,定义了具体策略类需要实现的方法。
  • ConcreteStrategyAConcreteStrategyB:具体策略类,实现了策略接口的方法,并提供不同的算法实现。
  • Context:上下文类,维护一个对策略对象的引用,并提供方法来设置和执行策略。

在示例中,我们创建了两个具体策略类ConcreteStrategyAConcreteStrategyB,它们分别实现了策略接口Strategy中的execute方法。Context类作为上下文对象,可以设置具体的策略对象,并通过execute_strategy方法执行策略。

在运行时,我们可以通过设置不同的策略对象来改变上下文对象的行为。通过调用execute_strategy方法,上下文对象会委派调用具体策略对象的执行方法。

策略模式的优势在于可以在运行时动态地改变算法的行为,而不需要修改客户端的代码。这种灵活性使得策略模式在许多场景下都有很好的应用,特别是当需要根据不同的情况选择不同的算法时,策略模式可以提供一种简洁、可扩展和易维护的解决方案。

实例

在这里插入图片描述
在这里插入图片描述

使用策略模式对中国的十二属相(Chinese Zodiac)设计查询系统。

在这里插入图片描述
在这里插入图片描述

策略模式与状态模式

在这里插入图片描述
在这里插入图片描述
策略模式(Strategy Pattern)和状态模式(State Pattern)是两种不同的行为型设计模式,它们都用于解决对象行为的变化和动态切换的问题,但在实现方式和应用场景上存在一些差异。

  • 策略模式关注的是不同算法或策略的替换和选择,它将每个策略封装在独立的类中,并使得这些策略对象可以相互替换,从而使得客户端可以在运行时选择不同的策略对象。策略模式通过封装不同的算法,使得算法可以独立于使用它们的客户端而变化。在策略模式中,客户端决定使用哪个策略,然后将控制权交给相应的策略对象。

  • 状态模式关注的是对象的状态变化,并在不同状态下提供不同的行为。它通过将对象的状态封装在独立的状态类中,并使得状态对象可以相互切换,从而实现不同状态下的不同行为。状态模式的关键在于将状态的切换和行为的实现分离开来,从而使得客户端可以根据对象的状态来选择相应的行为。在状态模式中,状态的切换是由上下文对象来控制的,上下文对象根据当前的状态选择相应的行为。

  • 虽然策略模式和状态模式都涉及到对象行为的变化和动态切换,但它们的重点和应用场景有所不同。策略模式主要用于选择和替换算法或策略,适用于需要在运行时根据不同情况选择不同算法的场景。而状态模式主要用于管理对象的状态变化和相应的行为切换,适用于对象具有多个状态,且每个状态下的行为有所不同的场景。

需要注意的是,策略模式和状态模式都可以提高代码的灵活性和可维护性,通过将变化的部分封装起来,使得变化不会影响到其他部分的代码。根据具体的需求和设计目标,选择合适的设计模式来解决问题是很重要的。

课程作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Django】Django框架使用指南

Django使用指南 作者简介:嗨~博主目前是长安大学软件工程专硕在读📘,喜欢钻研一些自己感兴趣的计算机技术,求关注😉! 框架简介:Django是一个基于Python语言的开源Web应用框架,采用 M…

路径规划算法:基于学生心理学优化的路径规划算法- 附代码

路径规划算法:基于学生心理学优化的路径规划算法- 附代码 文章目录 路径规划算法:基于学生心理学优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能…

Django框架-11

聚合查询 1.聚合函数 使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最 小,Sum 求和,被定义在django.db.models中。 例:查询图书的总阅读量。 from mo…

数据结构错题集 第七章 查找

7.2 124 等比 1(1-2^h)/(1-2) 2^h - 1 查找失败的最小次数相等吗? 13.A D 推一下公式 (M1)/2 平均查找长度 17.有序 就可二分查找 记住向下取整就是往右 13题就是个例子 向上取整就是往左 7.3 A错 不会分裂 不是平衡树 12。 C 黑高…

硬件基础——数字电路门电路

门电路与D触发器 一、与门 1.基本定义 与门又称 “与电路”、逻辑“积”、逻辑“与”电路,是执行“与”运算的基本逻辑门电路。有多个输入端,一个输出端。当所有的输入同时为高电平(逻辑1)时,输出才为高电平&#xf…

服务器进程查询

1. 查看当前正在运行的所有进程 ps -ef :查看当前所有正在运行的进程 UID:真实用户IDPID:进程的 IDPPID:父进程的 PIDCMD:运行当前进程的命令 2. 查看运行当前进程的指令 ps -aux | grep PIDPID表示你需要查询的进…

Linux 学习记录46(QT篇待完成)

Linux 学习记录46(QT篇) 本文目录 Linux 学习记录46(QT篇)一、建立QT项目工程二、1.2. 三、自动生成的文件介绍1. tempprj.pro2. mainwindow.h3. mainwindow.cpp4. main.cpp5. mainwindow.ui 四、常用类的介绍1. 信息调试类(1. qDebug(2. 输出当前界面尺寸(3. 设置当前界面尺寸…

第七章:YOLO v2网络详解

(目标检测篇)系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

PYQT QWidget的方法介绍

https://img-blog.csdnimg.cn/bae4318f1a9342ff85c9e7d27652cf91.png

uniapp打包app,对接华为厂商,实现unipush离线消息推送

今天终于可以抽出点时间,来记录一下这几天心塞的心情。上周公司派过来一个活,说是使用uniapp制作一个app,同时要实现在线消息推送和离线消息推送,啥话没说就揽了下来。不过说实在的,从来没有开发过app,好歹…

【网络安全带你练爬虫-100练】第9练:post提交/提取json数据包

目录 一、目标1:post提交json数据包 二、目标2:接收json数据包 三、目标3:提取指定的键值 四、网络安全小圈子 一、目标1:post提交json数据包 (大家可以自己随便找一个,像一些登录过的网站刷新一下&am…

jenkins构建历史设置保留数量

jenkins默认保留构建历史所有,这样磁盘空间越来越小,设置保留个数。 进入job项目中-配置 勾选Discard old builds,设置保留天数和个数,可以只填保留个数。 应用保存job配置,并重新构建项目,重新构建完成后…

基于pyqt5+opencv实现16位tif影像转jpg

现在大部分图像软件都支持tiff影像的浏览,但都是仅限于8位的影像,对应CV16U类型的tiff影像并不支持(这需要专业的gis软件才可进行操作)。为了便捷操作,故此基于pyqt5opencv实现16位tif影像转jpg的软件。 本博文涉及基于…

OpenCV4通道的分离split(),通道的合并merge(),通道的混合mixChannels()

文章目录 1、通道的分离函数 split()函数原型&#xff1a;&#xff08;1&#xff09;函数原型一&#xff1a;用 Mat型数组 Mat mvbegin[3]存储分离后的图像&#xff1b;输入参数&#xff1a; &#xff08;2&#xff09;函数原型二&#xff1a;用 vector容器 vector <Mat>…

科技中心PMO的建设与实践︱德邦证券PMO专家张鉴庭

德邦证券科技中心PMO专家张鉴庭先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;科技中心PMO的建设与实践。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 在数字化转型的背景下&#xff0c…

jvm对象创建和内存分配优化

一、创建对象过程 1、类加载检测 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加载过程。 …

ModaHub魔搭社区:向量数据库Milvus Lite的优势和适配场景

目录 Milvus Lite 的优势 Milvus Lite 的适配场景 如何安装、部署和使用 Milvus Lite? 总结 想要体验世界上最快的向量数据库&#xff1f;缺少专业的工程师团队作为支撑&#xff1f;Milvus 安装环境受限&#xff1f; 别担心&#xff0c;轻量版 Milvus 来啦&#xff01; …

火爆全网,python自动化测试 parametrize参数化+allure测试报告(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest的参数化&a…

1763_gcc编译c语言makefile自动生成工具的Perl实现_Linux

全部学习汇总&#xff1a; GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and lets find an common way so we may dont need to touch makefile code any more! (github.com) 其实&#xff0c;调试完这个之后觉得之前Windows上…

开源:老朋友,新棋局

在软件开发领域&#xff0c;开源已经成为一股强大的力量&#xff0c;为企业带来了巨大的好处。我深知开源的价值和影响力。其中之一就是降低开发成本。传统的软件开发往往需要庞大的开发团队和昂贵的授权费用&#xff0c;但开源软件将这一切变得通俗易懂。 避免了重复造轮子&a…