模式设计之状态模式

设计模式:状态模式TCPConnection案例 设计模式:状态模式TCPConnection案例,详细介绍可参考我的csdn博客。 立即下载
介绍
  • 在通信网络中, TCP连接时用到的状态机就可以用该模式来实现, 即在当前系统有指定的集中状态且有如下的转换关系A–>B, B–>C, C–>D, D–>A, A–>D….., 上面的集中转换路线是在某些条件下才触发的, 这种情况就适合用状态机;
  • 状态的切换不像普通的if else if else的应用, 对一些简单的条件判断或简单的状态切换是没有必要以增加子类的方法来处理的, 直接用if或switch就已经够了, 但对于很多实际应用, 往往状态之间的切换会有很多附带的东西的变化, 这个时候用状态机来封装这些变化,使得客户端不用取处理这些细节, 例如游戏世界天气系统可以分为 早上, 中午, 晚上, 深夜四种状态, 我们可以为每种状态下的游戏世界加入不同的天气, NPC…, 这里面可能会有大量要切换的信息, 如果部封装, 那么客户端可能就需要处理大量的细节.
  • 在用状态机模式前, 客户端需要介入改变状态, 而状态的改变实现是复杂的;
  • 在使用状态机后, 客户端可以直接使用Event实现, 根本不必关系该时间导致如何状态变化, 这些变化都将由状态机内部实现; 这是一种Event - condition - state, 状态模式封装了condition - state部分;
例子
  • 现在依然以小梦和小明的故事来做例子:恋爱向来不是一帆风顺, 两个人磨合的过程难免会出现各种分歧, 因此吵架在所难免, 现在将吵架前后的几种状态变化列出:
    A: 吵架前的甜蜜状态LoveState, B:出现分歧时的吵架状态QuarrelState, C:吵完后的冷静状态CalmdownState, D: 和好状态ForgiveState; 上面的四种状态,存在这样的转换过程:
    • A–>B: have different opinion
    • B–>C: no one compromise and have a stormy quarrelled
    • C–>D: calmdown and forgive eachother
    • C–>B: not figured and quarrelled again
  • 每种状态下的心情是各不相同,
    • A: sweet
    • B: angry
    • C: thinking
    • D: guilt

这里写图片描述

代码
enum Scuess
{
    NOTOK = 0,
    ISOK = 1,
};
// 抽象状态
class State
{
public:
    virtual void feelling() = 0;
    virtual void DoForLove(FallInLove* love,const Scuess isok = ISOK) = 0;
};
class ForgiveState : public State
{
public:
    virtual void feelling()
    {
        cout<<"xiaoming and xiaomeng  forgave eachother"<<endl;
    }
    virtual void DoForLove(FallInLove* love,const Scuess isok = ISOK)
    {
         love->SetState( new LoveState);
    }
};
class CalmdownState : public State
{
public:
    virtual void feelling()
    {
        cout<<"xiaoming and xiaomeng calmed down and thought about what's wrong"<<endl;
    }
     virtual void DoForLove(FallInLove* love,const Scuess isok = ISOK)
     {
    switch(isok)
        {
        case ISOK:
             love->SetState(new ForgiveState);
            break;
        case NOTOK:
             love->SetState(new QuarrelState);
            break;
        }
    }
};
class QuarrelState : public State
{
public:
    virtual void feelling()
    {
        cout<<"xiaoming and xiaomeng feel angry"<<endl;
    }
     virtual void DoForLove(FallInLove* love,const Scuess isok = ISOK)
     {
        love->SetState(new CalmdownState);
     }
};
class LoveState : public State
{
public:
    virtual void feelling()
    {
        cout<<"xiaoming and xiaomeng feel sweet"<<endl;
    }
    virtual void DoForLove(FallInLove* love,const Scuess isok = ISOK)
    {
        love->SetState(new QuarrelState);
    }
};
class FallInLove
{
public:
    void SetState(State* st)
    {
        if(state) delete state;
        state = st;
    }
    void Lover( Scuess isok = ISOK)
    {
        state->feelling();
        state->DoForLove(this, isok);
    }
private:
    State* state;
};
int main()
{
    FallInLove* they = new FallInLove;
    they->SetState(new LoveState);
    they->Lover(); // 状态的切换
    they->Lover();
    they->Lover(NOTOK);
    they->Lover(NOTOK);
    they->Lover(ISOK);
    they->Lover(ISOK);
    they->Lover();
    return 0;
}

这里写图片描述

基于NXP BFU730F的宽带WiFi LNA设计:从原理到实测的完整指南 低噪声放大器(LNA)是无线通信接收链路中的关键器件,其性能直接决定了系统的接收灵敏度。LNA的核心原理是在放大微弱信号的同时,尽可能降低自身引入的噪声,并保持良好的线性度以应对强干扰。在宽带应用场景下,如覆盖2.4GHz至5.9GHz的现代WiFi系统,设计需在宽带匹配、噪声优化和增益平坦度之间取得精妙平衡。本文以NXP的BFU730F SiGe:C HBT晶体管为核心,深入解析一种采用电阻反馈和LC匹配网络的经典宽带LNA架构。该设计通过优化反馈网络,在宽达3.5GHz的频带内实现了优异的噪声系数(低至 阅读详情

相关推荐

别再手动填数据了!Vivado里用.coe文件给ROM IP核预装数据的保姆级教程

本文详细介绍了在Vivado中使用.coe文件为ROM IP核预装数据的全流程教程,包括文件格式规范、数据转换技巧和Vivado配置指南。通过自动化数据加载,开发者可以显著提升FPGA开发效率,避免手动输入错误,适用于查找表、波形存储等多种应用场景。

weixin_33377602的博客 337

TCP/IP详解学习笔记(10)-TCP连接的建立与中止

TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,可以看到,TCP连接的建立可以简单的称为三次握手,而连接的中

一块积木 2万+

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1670

设计模式之状态模式

状态模式 状态模式允许对象内部状态改变的时候改变其行为。状态模式是对象的行为模式。 状态模式就是把对象的状态封装在一个状态对象中,每个状态一个类。 图如下: 抽象的状态角色TcpState封装了一个特定的状态对应的行为;具体状态角色TcpEstablesedSate(已连接状态),TcpListeningSate(监听状态),TcpClosedState(关闭状态)代表了tcp连接的所有状态(模...

JWT的博客 524

Neo4j Desktop新手必看:3分钟搞定CSV数据导入(附常见报错解决方案)

本文详细介绍了在Neo4j Desktop中高效导入CSV数据的三种主流方法,包括图形化界面操作、命令行批量导入和Python驱动编程导入,并提供了常见报错解决方案和性能优化技巧,帮助新手快速构建知识图谱。

lambda的博客 648

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

设计模式学习(六) 状态模式

状态模式场景描述设计思路UML 这是个人学习编程模式的系列学习笔记第六篇。 采用Qt Creator进行编写,但尽量采用C++基础语法。 状态模式(Stat Pattern):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 这种模式主要是用于处理两类情况: 1、有大量的ifelseif的判断,这样的写法不利于代码的维护和修改,如果有新的修改,对一大片这样的判断代码进行修改...

anjiayin的博客 295

Week 9 10 Neural Networks

Week 9 10 Neural Networks

金州饿霸吃不饱的博客 403

大话设计模式之状态模式

状态模式     当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类   abstractclass State { public abstract void Handler(Context context); }; class ConcretStateA :State { public override void Handler(Context

博客 1152

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

Plant Simulation智能行车/天车/起重机建模(1)-基本对象说明

摘要: MultiPortalCrane(多门式起重机)是一种灵活物料搬运设备,适用于造船、钢铁等行业,支持零件预组装、钢板/钢卷智能料场管理及设备装卸。其特点包括: 多门架协同:支持同轨道多门架运行,内置防撞检测; 模块化控制:可独立调节门架、小车及吊钩的速度、加速度和悬臂长度; 多样化搬运:通过目标位置设置或连接器实现零件运输; 故障与统计:可配置MTTR和可用率,实时监控各部件状态。 通过对话框可自定义轨道尺寸、门架数量及运动参数,并支持编程调用(如getPortals方法)。适用于需高精度定位和协同

qq_31964455的博客 314

java设计模式---状态模式(State pattern)

java设计模式—状态模式(State pattern) 1. 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状...

渔潭的博客 477

PCL 三维重建 基于B样条曲线的曲面重建算法

本文将介绍如何使用B样条曲线进行三维点云数据的曲面重建。B样条曲线和曲面是一种强大的数学工具,在计算机图形学、CAD设计等领域中广泛应用。通过对点云数据进行曲面拟合和优化,最终得到精确的曲面模型。本示例展示了如何利用PCL中的B样条曲线拟合算法进行三维曲面重建,并对重建结果进行可视化。

纵马踏花向自由 658

【设计模式二十三之状态StatePattern模式】状态模式StatePattern

解释器模式细说解释器模式细说解释器模式定义UML模型基于UML的代码场景一场景代码场景二场景代码解释器模式应用和注意事项 细说解释器模式 提示: 博主:章飞 _906285288的博客 博客地址:http://blog.youkuaiyun.com/qq_29924041 细说解释器模式 定义 UML模型 基于UML的代码 场景一 场景 代码 场景二 场景 代码 解释器模式应用和注意事项 欢迎继续...

章飞 _906285288的博客 886

pscad IEEE标准系统搭建说明

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

小威的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

wesigj的博客 2030

lwip-2.0.3

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

二十三种设计模式——状态模式(State Pattern)

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使...

也曾北风温柔以待 554

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

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

倔强老吕的博客 1211

设计模式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

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

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

码鹿的记录 631

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

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

小吕丶Code阶区 3891

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

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

kaven 1248

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

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

魔法师之家 1792

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

允许一个对象在其内部状态改变时改变它的行为。对象将行为封装到不同的状态类中,并在状态改变时切换状态。

遇见伯灵说的博客 1076

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。 文章目录设计模式 ~ 行为型模式 ~ 状态模式 ~ State Pattern。

lyfGeek的博客 142

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

*状态模式(State Pattern)* **允许一个对象在其内部状态改变时自动改变其行为,对象看起来就像是改变了它的类。** 例子:黄灯改变会变成红灯,红灯改变会变成绿灯。 1)抽象状态类(State类):抽象状态类定义了一个具体状态类需要实现的行为约定。 2)具体状态类(...

u012075901的博客 335
上一篇: 设计模式之适配器
下一篇: Lua闭包的理解
呵离
博客等级 码龄12年 18粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值