我所理解的设计模式(C++实现)——状态模式(State Pattern)

源于Design Pattern Explanation with C++ Implementation的 设计模式 C++ 1、单例模式(Singleton Pattern ) 2、抽象工厂模式(Abstract Factory Pattern ) 3、工厂方法模式(Factory Method Pattern ) 4、简单工厂模式(Simple Factory Pattern ) 5、建造者模式(Builder Pattern ) 6、原型模式(Prototype Pattern ) 7、结构模式(Str 阅读详情

概述:

     看看我们平时用的开关,同样一个开关他有2种状态:开和关,当她处于不同的状态的时候她的行为是不一样的,比如当她是开着的时候,你按她一下,她就变成了关闭状态,她是关着的时候按她一下,她就变成了开着的状态。看上去就像是改变了它的类一样,其实我们开发者都知道,我们里面用到了if-else,但是当碰到更多状态时就会造成很多很多if-else,设计和维护就相当的复杂,我们将要学习的状态模式就是允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。 

类图和实例:


上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。

抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。

具体状态(Concrete State):实现抽象状态定义的接口。 

这里我们举星际争霸里的坦克作为例子,它不架起来的时候可以攻击,可以移动。架起来的时候攻击增强,但是不能移动:

#include <iostream>
class SiegeTank;
class ISiegeTankState
{
public:
	virtual void move(int x, int y) = 0;
	virtual void attack() = 0;
};

class SiegeState : public ISiegeTankState
{
public:
	SiegeState(SiegeTank* pTank): m_pTank(pTank){}
	
	virtual void move(int x, int y)
	{
		std::cout << "Can't move in siege mode." << std::endl;
	}

	virtual void attack()
	{
		std::cout << "Attacking for 40" << std::endl;
	}

private:
	SiegeTank* m_pTank;
};

class TankState : public ISiegeTankState
{
public:
	TankState(SiegeTank* pTank): m_pTank(pTank){}

	virtual void move(int x, int y)
	{
		std::cout << "Move to (" << x << ", " << y << ")" << std::endl;
	}

	virtual void attack()
	{
		std::cout << "Attacking for 20" << std::endl;
	}

private:
	SiegeTank* m_pTank;
};

class SiegeTank
{
public:
	SiegeTank()
	{
		m_pTankState = new TankState(this);
		m_pSiegeState = new SiegeState(this);
		m_pSiegeTankState = m_pTankState;
	}

	void enterTankMode()
	{
		m_pSiegeTankState = m_pTankState;
		std::cout << "Switch to tank mode" << std::endl;
	}

	void enterSiegeMode()
	{
		m_pSiegeTankState = m_pSiegeState;
		std::cout << "Switch to siege mode" << std::endl;
	}

public:
	void attack()
	{
		m_pSiegeTankState->attack();
	}

	void move(int x, int y)
	{
		m_pSiegeTankState->move(x, y);
	}

private:
	void setState(ISiegeTankState* pSiegeTankMode)
	{
		m_pSiegeTankState = pSiegeTankMode;
	}

private:
	TankState* m_pTankState;
	SiegeState* m_pSiegeState;
	ISiegeTankState* m_pSiegeTankState;
};

int main()
{
	SiegeTank tank;
	tank.enterTankMode();
	tank.attack();
	tank.move(1, 1);

	tank.enterSiegeMode();
	tank.attack();
	tank.move(2, 2);

	tank.enterTankMode();
	tank.attack();
	tank.move(3, 3);

	return 0;
}

解决的问题:

状态模式主要解决的是当控制一个对象状态装换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。
当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

优缺点:

优点

1,状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

2,所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

3,状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点

1,状态模式的使用必然会增加系统类和对象的个数。
2,状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。


LCL_data原创于youkuaiyun.com【http://blog.youkuaiyun.com/lcl_data/article/details/10248415】

更多设计模式文章请参考:我所理解的设计模式

C++设计模式——状态模式(State) 状态模式 在软件构建过程中,某些对象的状态变化会导致行为也随之变化。允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了其行为。 enum NetworkState{ Network_Open, Network_Close, Network_Connect, }; class NetworkProcessor{ NetworkState state; public: void Operation1(){ if (state == Netw 阅读详情

相关推荐

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1304

C++之状态(State)模式

0. 简介 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。这其实就有点类似算法中的有限状态机的形式。 其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。 1. 状态模式示意图 策略模式和状态模式两个模式很相似,区别就在于策

lovely_yoshino的博客 6266

折叠式共源共栅放大器设计/备忘

w折叠式共源共栅基本结构如图

Czy1377004611的博客 3万+

C++设计模式之状态模式(state)(行为型)

一 定义 状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把不同状态的操作分散到不同的状态对象里去完成。在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样...

janeqi1987的专栏 4411

UE5 使用Slate制作对话窗口

使用Slate制作对话框窗口并获取对话框结果,非UMG

qq_25521145的博客 3188

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 152

C++ 设计模式——状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态发生变化时,动态地改变其行为。该模式的核心在于将状态相关的行为封装到独立的状态类中,使得对象的行为随状态而变化,从而减少冗余的条件判断。

慢慢记录,慢慢更新。 2146

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

C++写一个简单的状态机实现

在这个示例中,我们添加了一个名为Event的枚举以表示可能的事件。我们还为StateMachine类添加了一个handleEvent方法,该方法接收一个Event参数并根据事件类型调用相应的函数(如start、pause等)。现在,在main函数中,您可以通过调用stateMachine.handleEvent并传递相应的事件来测试状态跳转。在C++中实现一个事件驱动的状态机,您可以在StateMachine类中添加事件枚举和处理事件的方法。

renjianhhong的博客 2006

6、哈代空间、算子函数及相关概念解析

本文深入探讨了数学中哈代空间与算子函数的核心概念,包括强函数的因式分解、半单零点的定义与性质、Blaschke-Potapov乘积的存在性、Nagy-Foias模型算子的结构与谱分析、可数集合的相关性质(如Carlesonian集合、稀有集合等)、简单分式族的可分性与基性质,以及指数型整函数的增长特性。文章还分析了这些数学对象之间的内在联系,并通过图表与表格形式直观呈现了集合性质与函数空间结构的关系。这些理论不仅在数学分析和泛函分析中具有重要意义,也在信号处理、量子力学等应用领域具有广泛价值。

yhn4567890的博客 169

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1484

C++设计模式——状态模式(state pattern)

一、原理讲解 别名状态对象(object for state)。 1.1意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 1.2应用场景 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为; 一个操作中含有庞大的分支语句的条件语句,且这些分支依赖于该对象的状态; 1.3结构图(UML图) 1.4代码实现步骤 a1 定义一个状态接口类IState,定义一个接口函数handle(); a2 定义一个具体状态类ConcreteState,实现接口函数handl

净无邪博客 1301

【11】GD32H7xx MPU记录

GD32H7xx系列MPU内存保护单元模块的使用记录

madao1234的博客 871

设计模式:状态模式(State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。

倔强老吕的博客 1211

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【设计模式】——状态模式(State Pattern)

状态模式(State Pattern)是一种重要的行为型设计模式,它允许一个对象在其内部状态改变时改变其行为,使得对象看起来像是改变了它的类。状态模式通过将状态相关的行为封装在独立的状态类中,有效地简化了条件逻辑,提高了代码的可维护性和可扩展性。

J^T的博客 981

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++ 设计模式:状态模式(State Pattern)

C++ 设计模式:状态模式(State Pattern)

冀晓武的博客 1006

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern

本节我们学习了如何通过 **状态模式(State Pattern)** 来有效地管理一个对象的状态转换及其行为,尤其是在复杂的控制系统(如电梯控制系统)中应用。

m0_73800387的博客 3194

行为模式之状态模式(State Pattern)C++实现

定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。将状态封装成为独立的类,并将动作委托到代表当前状态的对象。将状态逻辑和动作实现进行分离。 状态模式类图: 它与策略模式的类图一模一样,但是它们的差别在于“意图”。 它和程序状态机(PSM)不同,状态模式用类代表状态。Context会将行为委托给当前状态对象。状态模式允许Context随着状态的改变而改变行为。

xiaoding133的专栏【Stay hungry,Stay foolish】 1391

C++设计模式之状态模式

context(shared_ptr<state> state) : mState(state){}// 构造函数,初始化状态。// 创建状态B的实例。

2201_75835705的博客 634

设计模式 Design Parttern ——状态模式State

设计模式 Design Parttern ——状态模式State

leeidea的专栏 591

状态模式(State Pattern,对象行为型模式)

意图以类表示状态 允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎修改了它的类。适用性在下面的两种情况下均可使用State模式: 1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一

sld880311的专栏 1177

C++state模式技术,无止境

有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。FSM的实现方式:1) switch/case或者if/else这无

TrustZone领域先行者 1265

C++设计模式(Design pattern)

常用设计模式(Design Pattern) 设计模式的类型:创新型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns) 创新型模式:单例模式、抽象工厂模式、建造者模式、工厂方法模式、原型模式 结构型模式:适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式 行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、

笑着的博客 1903

State Pattern -- 状态模式原理及实现(C++)

主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍命令模式的实现。 问题出发点 在实际开发中,我们经常会遇到这种情况;一个对象有多种状态,在每一个状态下,都会有不同的行为。那么在代码中我们经常是这样实现的。 代码如下: typedef enum tagState { state0, state1, s...

weixin_30790841的博客 97

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。 类图与实例: Context(应用场景): 1、需要使用ConcreteStrategy提供的算法。 2、内部维护一个Strategy的实例。

yizhiniu_xuyw的专栏 241
上一篇: 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
下一篇: 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
十八道胡同
博客等级 码龄20年 848粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值