[设计模式]状态模式 (State)

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统 根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。 阅读详情

1.意图

       允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

2.结构与参与者


3.适用性

       1)一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

       2)一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态。这个状态通常用一个或者多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这个对象可以不依赖于其他对象而独立变化。

4.效果

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

       2)它使得状态转换显示化。

       3)State对象可被共享(见适用性2)。

5.代码示例

       一个银行账户的例子。

#include <iostream>
#include <string>

using namespace std;

//抽象状态类
class State
{
	
public:
	double m_amount;                          //这里写得非常丑陋
	virtual WithDraw(double amount)=0;
	virtual Diposit(double amount)=0;
};

//欠款状态
class RedState:public State
{
//private: StateChangeCheck()
public:
	RedState(double amount){m_amount=amount;}
	virtual WithDraw(double amount)
	{
		cout << "没有余额可以提现"<<endl;
	}
	virtual Diposit(double amount)
	{
		m_amount+=amount;
		cout << "您存入了:¥"<<amount<<endl; 
	}
};

//白银VIP
class SilverState:public State
{
public:
	SilverState(double amount){m_amount=amount;}
	virtual WithDraw(double amount)
	{
		m_amount-=amount;
		cout << "您取出了:¥"<<amount<<endl; 
	}
	virtual Diposit(double amount)
	{
		m_amount+=amount;
		cout << "您存入了:¥"<<amount<<endl; 
	}
};

//黄金VIP
class GoldState:public State
{
public:
	GoldState(double amount){m_amount=amount;}
	virtual WithDraw(double amount)
	{
		m_amount-=amount;
		cout << "您取出了:¥"<<amount<<endl; 
	}
	virtual Diposit(double amount)
	{
		m_amount+=amount;
		cout << "您存入了:¥"<<amount<<endl; 
	}
};

//Context类
class Account
{
private:
	State* m_pstate;
	string m_sowner;
	void StateChangeCheck()  
//不改变状态都要新建另外一个实例
//每次存取款的操作都将引起一个实例的构建,并且可能是多余的
//怎么改进???
	{
		if (m_pstate->m_amount<0)
		{
			m_pstate=new RedState(m_pstate->m_amount);
			cout << "小子,你欠款了,快还钱!!!"<<endl;
		}
		else if (m_pstate->m_amount>10000)
		{
			m_pstate=new GoldState(m_pstate->m_amount);
			cout << "您现在的身份是黄金VIP"<<endl;
		}
		else 
		{
			m_pstate=new SilverState(m_pstate->m_amount);
			cout << "您现在的身份是白银VIP"<<endl;
		}
	}
public:
	Account(string owner=""):m_sowner(owner)
	{
		m_pstate=new RedState(-10);
	}
	Account(State* state,string owner=""):m_sowner(owner),m_pstate(state){}
	void WithDraw(double amount)
	{
		m_pstate->WithDraw(amount);
		StateChangeCheck();
	}
	void Diposit(double amount)
	{
		m_pstate->Diposit(amount);
		StateChangeCheck();
	}
};
//客户端
int main()
{
	SilverState* sp=new SilverState(1000);
	Account* ap=new Account(sp,"sicofild");
	ap->Diposit(10000.00);
	ap->WithDraw(9000.00);
	ap->WithDraw(5000);
	ap->Diposit(100000.00);
	return 0;
}


家里摄像头录像存 NAS,空间爆满了怎么办?一招实现设定容量自动清理实现循环存储! 📷 家用摄像头录像久了会撑爆 NAS 吗?别担心,这篇文章教如何实现自动清理录像,释放 NAS 空间,避免爆盘🧹 阅读详情

相关推荐

C#上位机与VisionPro通用框架:视觉标定、通信联动与现场排坑实战

工业自动化设备的上位机开发,往往面临流程控制、视觉检测、通信交互等环节的重复搭建。C#作为主流工业语言,配合VisionPro视觉软件,可通过通用框架设计将状态机调度、相机采集、标定算法与串口/扫码枪通信等底层能力模块化,从而大幅降低项目交付成本。其核心原理在于:将设备工艺差异封装至配置层,视觉流程通过CogToolBlock工具链与VPP模板复用,九点标定建立像素与机械坐标系的映射关系。该方案已在螺丝锁付、点胶定位等多类产线落地,尤其适用于批量交付、换型频繁的视觉设备场景。这套从实践中沉淀的框架思路,以及

weixin_31102231的博客 336

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

英文原文:http://www.dofactory.com/Patterns/PatternState.aspx一、State Pattern (状态模式)Define: Allow an object to alter its behavior when its internal state changes. The object will appear to change its cl

薛敬明的专栏 1897

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 896

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

允许一个对象在内部状态改变时改变它的行为。 应用场景 一个对象的行为取决于它的状态,并且它在运行时根据状态改变它的行为。 代码中包含大量与对象状态相关的判断语句。 优点: 将不同的状态隔离 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖 增加新的状态非常简单 状态模式与责任链模式的区别 状态模式和责任链模式都能消除 if-else 分支过多的问题。但在某些情况下,状态模式中的状态可以理解为责任,那么在这种情况下,两种模式都可以使用。

魔法师之家 1792

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4566

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

C#设计模式读书笔记之状态模式(State Pattern)

状态模式(State pattern)【使用频率:★★★☆☆】 1.概述:允许一个对象在其内部状态改变时改变它的行为。 2.解决的问题:主要解决的是当控制一个对象状态转换的条件过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑判断简单化。 3.模式中的角色   3.1上下文环境(Context):在Context类中维护一个抽象状态类State的实例,这个...

qq826364410的专栏 528

对雷达中相位补偿概念的一些理解

基于多普勒相位补偿的速度扩展方法和DBF测角,两者本质上都是对相位进行补偿。

qq_42235129的博客 4030

设计模式之状态模式(State Design Pattern)

状态模式,是11种行为型模式之一。一个生存在流程整个周期的对象,因事件触发改变对象的状态进而影响对象的行为(流程的走向)。状态模式就是把对象的行为与状态进行封装,通过改变状态进而影响行为。 状态模式几个关键对象类型: Context:一个生存在流程整个周期的对象 Event:触发改变对象的状态的事件(Event)或条件(Condition) State: 封装对象状态的抽象类(State)和具体实现类 本文以请假流程为例,如图: 请假流程有的主管、部门、人事部都有各自的职责,而且有先后依..

xjj1314的专栏 491

【NVIDIA GR00T N1 从入门到精通】第1章 环境搭建与基础配置 第2章 数据准备与格式转换

针对新型机器人形态的适配,需完成从硬件接口到数据模式的完整配置流程。创建modality_config.py文件自定义形态配置通过继承基类实现。配置类需实例化以下组件:状态模态定义(观测空间)、动作模态定义(动作空间)、相机模态定义(视觉输入)、可选的标注模态定义(语言指令或成功判定)。每个模态配置指定数据类型、形状、归一化统计量以及时序采样策略。状态模态配置状态配置的核心参数包括与。定义策略观测的历史时域窗口,对于高动态操作(如投掷、击打),需扩展历史窗口以捕捉运动趋势;

VectorShift的博客 95

智能绿植管家:基于 ESP32 的室内植物自动补光与环境调控系统

本文设计的基于 ESP32 的室内植物自动补光与生长环境调控系统,实现了植物生长环境的自动化、智能化管理。硬件选型合理、接线简单,软件逻辑清晰、易于调试,能够有效解决室内植物生长环境不适的问题。系统具备良好的实用性和扩展性,可为园艺爱好者和小型培育场所提供稳定、高效的植物养护方案。

weixin_42300449的博客 146

JAVA设计模式之 状态模式【State Pattern】

一、概述     当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。状态模式是一种对象行为型模式。 二、适用场景     用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题。简单说就是处理对象的多种状态及其相互转换。

小吕丶Code阶区 3891

在 SAP BTP Cloud Foundry 环境中开发 SAP HANA 的完整实战路线图

SAP HANA Cloud迁移路径解析:从本地到云原生的数据库现代化 本文梳理了SAP HANA在Cloud Foundry环境中的架构定位和实施路径,针对不同起点的项目提供迁移建议。核心内容包括: SAP HANA Cloud在Cloud Foundry中的双重角色:既作为平台服务提供数据库实例,又通过HDI容器管理MTA应用中的数据库工件。 针对四类典型项目起点的迁移策略: 绿地项目:直接采用CAP+SAP HANA Cloud组合 已有HANA service或XS advanced项目:需对照兼容

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 263

设计模式-状态模式-State Pattern

这种模式通过将状态相关的行为封装在独立的类中,并在运行时根据状态对象来切换这些行为,从而使得对象能够在内部状态变化时合理地更改其行为。状态模式的优点在于它将状态相关的行为封装在具体的状态类中,使得状态转换逻辑清晰,并且可以在运行时动态地改变对象的行为。状态模式的优点包括局部化了状态相关的操作,将状态转换逻辑封装在状态对象内部,以及可以在运行时切换对象的行为。:在没有使用状态模式的情况下,对象的状态管理可能需要大量的条件分支语句,状态模式可以将这些条件分支分散到不同的状态类中。

wesigj的博客 2030

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式-18状态模式State Pattern

状态模式是一种行为设计模式,允许对象在内部状态改变时改变其行为。当对象的行为取决于状态且需要避免大量条件判断时,该模式特别有用。其核心结构包括:上下文(Context)维护当前状态,状态接口(State)定义行为,具体状态类实现不同状态下的行为。典型应用场景如自动售货机,通过状态模式可清晰管理"无硬币"、"有硬币"、"售出"等状态转换,避免复杂的条件分支,使代码更易维护和扩展。

d3y1`5 81_09 964

lwip-2.0.3

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

状态模式(State Design Pattern)

以此回顾《设计模式之禅》及其他设计模式书籍、视频中的状态模式。 什么是状态模式? Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. (当一个对象的内在状态改变时,允许它修改自己的行为。这个对象看起来像是改变了类)

西西&&C的专栏 1427

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

/** * 状态模式。 * @author Bright Lee */ public class StatePattern { public static void main(String[] args) { Context context = new Context(); context.request(); context.request(); } } cla...

look4liming的专栏 249

设计模式(Design pattern)之状态模式(state Pattern)

状态模式在电梯系统中的应用 该代码展示了状态模式在电梯控制系统中的实现。通过抽象StateElevator类定义四种操作(open/close/run/stop),并由四个具体状态类(Open/Run/Stop/Close)实现不同状态下的行为逻辑。Context类作为环境角色维护当前状态,各状态类可通过super.context改变状态。这种设计避免了大量条件判断,使状态转换清晰可见,但实际应用中可能存在状态类膨胀的问题。示例演示了电梯从开启状态开始,依次执行运行、开启、关闭和停止操作的状态转换过程。

RR1335 之代码才是动力源 220

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

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

J^T的博客 982

23种设计模式之状态模式(State Pattern)

本篇文章将23种设计模式中的状态模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 1万+

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

状态模式 定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 类型 行为型。 UML类图 角色 环境(Context)角色:环境角色含有状态角色的对象,并且可以处理一些请求,这些请求最终产生的响应会与状态相关。 状态(State)角色:状态角色定义了每一个状态的行为接口,这些行为将会在Context中得以使用。 具体状态(ConcreteState)角色:实现了相关行为...

kaven 1248

设计模式学习—状态模式(State Design Pattern)

设计模式之状态模式,一种行为型模式

闲鱼的博客 1034

Java设计模式——状态模式(STATE PATTERN)

Java设计模式——状态模式(STATE PATTERN) 转载:http://blog.youkuaiyun.com/u012401711/article/details/52675873

hackxiaoF的专栏 412

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

状态模式(State Pattern)又称状态机模式,是允许对象在内部状态发生改变时改变他的的行为,类的行为由状态决定,不同的状态有着不同的行为,对象看起来好像修改了它的类。属于行为型模式。一般涉及到电商订单相关的,会采用状态模式来设计,不同的订单状态,响应的都有不同的操作。 适用场景 1) 行为随状态改变而改变的场景 2) 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态状态抽象对象.........

Lucifer ZHAO 3747

23中设计模式C++实现(4)之状态模式(State Pattern)

简述: 状态模式又叫做有限状态机。适应场景:我们的对象有多种状态,单对象同一时刻只能保持某一种状态,并当内部变量或者内部变量变化时,我们的对象会在这些状态中变换。 UML结构图 Context(上下文):定义一个与 Client 交互的接口。它维护对 ConcreteState 对象的引用,可以用该对象来定义当前状态。 State(抽象状态):定义接口,来声明每个 ConcreteSt...

请叫我少爷的博客 296

秒懂设计模式之状态模式(State Pattern)

[版权申明] 非商业目的注明出处可自由转载 博文地址: 出自:shusheng007 设计模式汇总篇,一定要收藏: 永不磨灭的设计模式(有这一篇真够了,拒绝标题党) 概述 状态模式在日常开发中是一个非常实用的模式,可以将你的代码逼格迅速提升一个档次,所以让我们开始今天的卓越之旅吧。 类型 行为型(behavioral) 难度 3颗星 定义 当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 定义对于初学者没啥用,因为字都认识却无法理解其中的含义。必须等学完了,回过头来看才能更加深.

ShuSheng007的程序人生 3088
上一篇: [设计模式]设计模式中的指导原则
下一篇: [设计模式]观察者模式(Observer)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值