设计模式之策略设计模式

news2024/11/17 7:41:25

一、状态设计模式概念

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

 适用场景

  • 当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。
  • 当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。
  • 如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。
  • 当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。

状态设计模式的结构

  1. 上下文 (Context) 维护指向具体策略的引用, 且仅通过策略接口与该对象进行交流。
  2. 策略 (Strategy) 接口是所有具体策略的通用接口, 它声明了一个上下文用于执行策略的方法。
  3. 具体策略 (Concrete Strategies) 实现了上下文所用算法的各种不同变体。
  4. 当上下文需要运行算法时, 它会在其已连接的策略对象上调用执行方法。 上下文不清楚其所涉及的策略类型与算法的执行方式。
  5. 客户端 (Client) 会创建一个特定策略对象并将其传递给上下文。 上下文则会提供一个设置器以便客户端在运行时替换相关联的策略。

代码如下:

            问题:做一款打斗游戏,玩家使用的英雄使用不同的武器将会产生不同的损伤效果。
            解决方案:定义一些列的算法,把他们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。

#include <iostream>
#include <string>
class Weapon
{
public:
	virtual std::string fightAlgorithm() const = 0;
};

class Nife: public Weapon
{
public:
	std::string fightAlgorithm() const override
	{
        return "nife";
	}
};

class Axe : public Weapon
{
public:
	std::string fightAlgorithm() const override
	{
		return "Axe";
	}
};

//context
class Hero
{
private:
	Weapon* m_weapon;
public:
	Hero(Weapon* weapon=nullptr) : m_weapon(weapon)
	{

	}
	void setWeapon(Weapon* weapon)
	{
		m_weapon = weapon;
	}
	void fight()
	{
		std::cout << m_weapon->fightAlgorithm() << std::endl;
	}
};

int main()
{
	std::cout<<"客户端:nife攻击"<<std::endl;
    Nife nife;
    Hero hero1(&nife);
    hero1.fight();

    std::cout<<"客户端:Axe攻击"<<std::endl;
    Axe axe;
    hero1.setWeapon(&axe);
    hero1.fight();
    return 0;
}

 二、与其他模式的关系

  • 桥接模式 (opens new window)、 状态模式 (opens new window)和策略模式 (opens new window)(在某种程度上包括适配器模式 (opens new window)) 模式的接口非常相似。 实际上, 它们都基于组合模式 (opens new window)——即将工作委派给其他对象, 不过也各自解决了不同的问题。 模式并不只是以特定方式组织代码的配方, 你还可以使用它们来和其他开发者讨论模式所解决的问题。
  • 状态 (opens new window)可被视为策略 (opens new window)的扩展。 两者都基于组合机制: 它们都通过将部分工作委派给 “帮手” 对象来改变其在不同情景下的行为。 策略使得这些对象相互之间完全独立, 它们不知道其他对象的存在。 但状态模式没有限制具体状态之间的依赖, 且允许它们自行改变在不同情景下的状态。

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

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

相关文章

构建Python机器学习模型的8个步骤

本文旨在系统地介绍构建机器学习模型的基本步骤&#xff0c;并通过一个具体的实战案例——股票价格预测&#xff0c;展示这些步骤的实际应用。通过遵循这些步骤&#xff0c;读者可以更好地理解和掌握机器学习模型构建的全过程。 步骤一&#xff1a;定义问题 首先&#xff0c;我…

【移植】一种快速移植OpenHarmony Linux内核的方法

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

如何选择主数据管理系统平台

企业数据量呈现爆炸式增长&#xff0c;多系统并存、数据分散的现象日益普遍。主数据管理&#xff08;MDM&#xff09;作为确保企业核心业务数据准确、一致、完整的关键环节&#xff0c;对于企业的决策制定、业务流程优化和数据分析至关重要。而选择一个合适的主数据管理系统平台…

Vivado时序报告之CDC详解大全

目录 一、前言 二、Report CDC 2.1 Report CDC 2.2 配置界面 2.3 CDC报告 2.3.1 General Information 2.3.2 Summary 2.3.3 CDC Details 2.4 Waiver 2.4.1 设置Waiver 2.4.2 报告查看 2.4.3 去除Waiver设置 三、工程设计 四、参考资料 一、前言 前面已经针对…

别再使用[]来获取字典的值了,来尝试一下这些方法

字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。每个键都是唯一的&#xff0c;并且与某个值相关联。字典是Python中处理映射关系&#xff08;即一个键对应一…

使用VBA快速将文本转换为Word表格

Word提供了一个强调的文本转表格的功能&#xff0c;结合VBA可以实现文本快速转换表格。 示例文档如下所示。 现在需要将上述文档内容转换为如下格式的表格&#xff0c;表格内容的起始标志为。 示例代码如下。 Sub SearchTab()Application.DefaultTableSeparator "*&quo…

综合业务区的数字化创新与智能化蓝图

数字化智能管理的关键要素之一是综合业务区的电子标签系统&#xff0c;该系统在提高管理工作的效率、精确跟踪资源以及改善业务流程中扮演了至关重要的角色。以下内容将对这一综合业务区采用的智能电子标签系统进行深入剖析。 一、定义与功能 1.1定义 融合多功能于一体的智能…

Prometheus+Grafana+elasticsearch_exporter监控elasticsearch的简单配置过程

一、elasticsearch集群配置 elasticsearch的docker方式安装及golang1.22版本使用elasticsearch7的示例代码-CSDN博客 查找“创建elasticsearch集群”标题即可 服务器集群ip地址&#xff1a;192.168.137.21&#xff0c;192.168.137.22&#xff0c;192.168.137.23 二、启动Pr…

《自控》误差传递函数、稳态误差、0型、I型、II型系统

本文关键词&#xff1a; 误差传递函数、laplace终值定理、稳态误差、系统型别&#xff08;0型、I型、II型系统&#xff09; 目录 1、求误差传递函数 2、求稳态误差 2.1 Laplace终值定理的使用条件 3、系统型别&#xff08;I型、II型、III型系统&#xff09; 1、求误差传递…

IPEmotion 2024 R2现支持Amazon S3和Windows SMB服务器

新版IPEmotion 2024 R2软件推出了许多新功能&#xff0c;其中的一大功能是支持Amazon S3、Windows SMB服务器以及新的IPE-CAM-007 USB摄像头。IPEmotion 2024 R2还支持直接写入TEDS数据和配置可装载电池的新款IPE833记录仪。 — 创新成果一览 — ■ 支持Amazon S3、Windows SM…

甄选范文“论软件可靠性设计技术的应用”,软考高级论文,系统架构设计师论文

论文真题 随着软件的日益普及,系统中软件成分不断增加,使得系统对软件的依赖越来越强。软件的可靠性对系统可靠性的影响越来越大。而实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,为此提出了软件可靠性设计的概念。 软件可…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

Chainlit集成LlamaIndex实现知识库高级检索(路由检索器)

检索原理 llamaindex 是一个用于构建和部署基于文档的问答系统的框架。其中&#xff0c;RouterRetriever 是一个特定的检索器组件&#xff0c;它设计用于根据输入查询选择最佳的检索策略。RouterRetriever 的主要功能是在多个不同的检索器之间进行路由&#xff0c;根据输入的特…

STM32单片机编程调试常见问题(一) HardFault_Handler故障分析与解决

文章目录 一.概要二.什么是Hard fault三.Hard fault 产生的原因分析四.制作一个Hard fault程序并定位出问题原因1.查看堆栈指针SP的地址以及内容2.找到Return address地址3.查看汇编界面4.输入Return address地址&#xff0c;查找到问题代码 小结 一.概要 在嵌入式开发中&…

AR传送门+特定区域显示内容+放大镜 效果着色器使用

AR传送门特定区域显示内容放大镜 效果 关键词&#xff1a;Portal Mask 1、教程链接&#xff1a; AR 传送门教程 Unity - Portal Mask Implementation - Part 4_哔哩哔哩_bilibili 应用案例效果&#xff1a; 2、案例下载地址&#xff1a;使用unity 2021.3.33f1 obi 工具…

三分钟让你掌握PDF转音频:PDF2Audio背后的秘密

你有没有过这样的经历?工作繁忙,眼睛被一份又一份的PDF文件轰炸,盯得头昏眼花,却还得继续阅读。如果我告诉你,有一个简单的工具,可以把那些厚厚的PDF文档变成语音,让你在通勤、做家务时“听”文件,而不是“看”文件,你会不会心动? 今天,我们就来聊聊一个叫做PDF…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

交通 | ACM SIGSPATIAL 24 深度强化学习求解多周期设施选址问题

论文作者信息&#xff1a;Changhao Miao, Yuntian Zhang, Tongyu Wu, Fang Deng, and Chen Chen. 2024. Deep Reinforcement Learning for Multi-Period Facility Location: p k p_{k} pk​-median Dynamic Location Problem. In The 32nd ACM International Conference on Ad…

如何评估和观测 IoTDB 所需的网络带宽?

IoTDB 推荐网络配置监控网络 I/O 一网打尽&#xff01; 网络数据传输速度太慢&#xff1f;延迟太高&#xff1f; 网络的硬件配置如何确定&#xff1f; 网络流量过大导致拥塞&#xff1f; 在现代计算机系统和应用程序中&#xff0c;网络 I/O 性能是决定整体系统表现的关键因素之…