C++ 中策略模式与状态模式的区别2025年03月22日 | 阅读 10 分钟 C++ 具有两种行为设计模式:状态模式和策略模式。然而,它们的功能是不同的。由于策略模式,对象可以在运行时从多种算法中选择以更改其行为。忽略对象的内部状态,其主要目标是封装可互换的算法。另一方面,状态模式封装了特定于状态的行为,允许对象随着其内部状态的变化而改变其行为。策略模式将算法与客户端分离,而状态模式控制对象状态的变化。策略和状态处理由状态驱动的行为。然而,两者都提供了灵活性。在本文中,我们将讨论策略模式与状态模式之间的区别。在讨论它们的区别之前,我们必须了解策略模式和状态模式及其特性。 什么是策略模式?策略模式是一种行为设计模式,它允许在运行时选择算法。它包含其定义家族中的所有算法,并使它们可互换。因此,算法可以在不影响使用它的客户端的情况下进行更改。这使其非常适合需要根据情况使用不同方法或策略,而又不影响对象主要功能的情况。 每个算法都包含在策略模式定义的类中。它允许客户端在不更改对象的基本逻辑的情况下动态地切换策略。无论选择哪种算法或“策略”,客户端都可以始终以相同的方式与它们进行交互,因为它们都符合相同的接口。 策略模式的关键组成部分策略模式的几个关键组成部分如下:
C++ 中策略模式的特点C++ 中策略模式的几个关键特点如下:
策略模式的优点C++ 中策略模式的几个优点如下:
策略模式的缺点C++ 中策略模式的几个缺点如下:
示例让我们举一个例子来说明 C++ 中的策略模式。 输出 Executing the strategy A Executing the strategy B 说明这个 C++ 程序展示了策略模式,该模式允许在运行时动态选择算法。Strategy 类是一个抽象基类,它定义了所有策略必须实现的 execute() 函数。两个具体策略,ConcreteStrategyA 和 ConcreteStrategyB,提供了它们对 execute() 函数的实现,该函数将不同的消息打印到控制台。Context 类维护一个指向 Strategy 对象的指针,该对象最初通过其构造函数设置。setStrategy() 方法允许在不同策略之间进行运行时切换,而 executeStrategy() 方法调用当前选定策略的 execute() 函数。Context 在 main() 函数中以 ConcreteStrategyA 开始,然后切换到 ConcreteStrategyB 并执行两种策略。这种模式通过将算法与使用它的上下文分离开来,促进了灵活性。 什么是状态模式?状态模式是一种行为设计模式,它允许对象根据其内部状态的变化来调整其行为。与其使用许多条件语句,不如使用它来表达对象的各种状态以及它们之间的转换。此模式在 C++ 中对于描述行为因状态而异且可能处于多种可能状态之一的对象很有用。 此模式通过让状态对象本身处理状态转换,从而减少了对管理状态更改的大型条件语句(如 if-else 或 switch 语句)的需求,从而提高了灵活性。更模块化、可读且可维护的代码得以实现。 对于 C++ 中的每种状态,状态模式都指定一个不同的类,这些类实现了与该状态相关的操作。由于对象(上下文)将行为委托给当前状态对象,因此它允许在运行时进行动态修改。由于它们具有通用接口,因此上下文可以轻松地在状态类之间切换。 状态模式的关键组成部分状态模式的几个关键组成部分如下:
状态模式的特点状态模式的几个特点如下:
状态模式的优点状态模式的几个优点如下:
状态模式的缺点状态模式的几个优点如下:
用例状态模式的几个用例如下:
示例让我们举一个例子来说明 C++ 中的状态模式。 输出 Handling the state A behavior Handling the state B behavior 说明此 C++ 应用程序演示了状态模式,该模式允许 对象 根据其内部状态的变化而改变行为。为了使每个状态能够 工作,程序首先定义一个具有纯虚函数 handle() 的 State 接口。此方法用于在两种具体状态 ConcreteStateA 和 ConcreteStateB 中提供特定于状态的行为。Context 类调用当前状态的 handle() 方法,并维护一个指向当前状态的智能指针。在 main 函数中设置初始状态(ConcreteStateA)后,request() 方法会调用当前状态的行为。然后上下文切换到新状态(ConcreteStateB),展示行为如何根据状态变化动态调整。此实现使用智能指针 (unique_ptr) 来有效管理状态内存,确保在状态更改时自动释放资源。 C++ 中策略模式和状态模式之间的主要区别![]() 策略模式和状态模式之间存在几个主要区别。一些主要区别如下:
结论总之,策略模式侧重于封装算法,以便客户端可以在运行时选择和切换它们。 另一方面,状态模式侧重于控制与状态相关的行为,允许对象响应其内部状态的变化而修改其行为。尽管它们用于不同的场景和不同的目的,但这两种模式都提高了应用程序的灵活性和可维护性。 下一个主题C++ 编译器 |
在本文中,我们将讨论 C++ 中的 std::countr_zero 方法及其语法和示例。C++ 中的 std::countr_zero() 方法是什么?countr_zero 函数在 C++20 中引入。此函数位于 <bit> 头文件中。此函数用于计算末尾零的数量...
阅读 4 分钟
在许多软件应用程序中,精确测量执行时间至关重要,尤其是在优化代码或评估各种算法的性能时。为了精确测量 C++ 中的执行时间,必须使用 C++11 中引入的 <chrono> 库捕获和计算时间间隔。一系列...
阅读 4 分钟
在本文中,我们将讨论 C++ 中 std::thread 和 OpenMP 之间的区别。在深入探讨区别之前,让我们详细了解每个术语及其功能。什么是 C++ 中的 std::thread? std::thread 是程序的最小单元。当您运行叙事设计时...
5 分钟阅读
普罗数是形如 N = k⋅2n + 1 的正整数,其中 k 是奇数正整数,n 是正整数,且 2n > k。这些数对于素数测试和数论很重要。普罗素是普罗数,它们...
阅读9分钟
概述 ECMAScript 在许多编程语言和脚本语言中都很有用,它是 JavaScript 和相关语言的基础。它为关键字的结构和行为定义了严格的规则。但是,由于语言模型和标准库的差异,将这些规则直接翻译成 C++ 可能会有问题。库……
阅读 6 分钟
C++ STL(标准模板库)提供了各种强大的函数和算法,有助于加快开发速度。其中一个函数是 std::filling,它代表 C++ 中负责加快填充选定元素的过程...
阅读 3 分钟
引言:在 C++ 中处理字符串时,正确处理字符编码是必须的。例如,一个常见的任务是将多字节字符串反转为宽字符字符串,反之亦然。这正是 std::wcstombs 功能发挥作用的地方。现在,让我们看看...
阅读 4 分钟
在本文中,我们将讨论以及它的实现。这意味着我们需要确定给定一组 2D 点的半径为 r 的圆所包含(位于圆内而不是在其边界上)的最大点数……
5 分钟阅读
引言:理解定量序列结构的问题可以称为算法问题解决。一种这样的结构是“山谷”,即一个序列先减少到其最小值,然后再次增加。这些类型的问题在各种领域都有应用,例如...
阅读 8 分钟
在本文中,我们将讨论 C++ 中的 Chalkboard XIR 游戏。问题陈述:此问题涉及一个游戏,玩家使用一个名为 countnums 的整数数组在黑板上写数字。Radha 和 Bob 是两个玩家,他们轮流从...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India