【设计模式】状态模式

news2024/11/18 14:01:51

状态模式

状态机

在操作系统的调度中会存在三种状态:运行、就绪、阻塞。

这是比较典型的状态机的例子。

做产品的时候,我们总能遇到一些比较复杂的逻辑问题,而普通的流程图,或时序图对于对象和状态的解读缺乏直观的描述。

这里我们推荐使用简单的状态图来对逻辑问题进行描述:

有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。

状态模式

状态模式简单来说就是使用不同的状态,来描述一个在有限状态中转化的问题。

同时使用不同状态下不同的响应方式,来对有限问题做出解决。

C语言状态模式实现

给出如下场景,在一个字符串中,我们希望获取其中单词的个数

使用状态的转换对单词的描述。

enum StrState{
    BEGIN = 1,INWORD, OUTWORD
};
int getWordNum(const char* str) {
    StrState state = BEGIN;
    int num = 0;
    for (int i = 0; str[i] != '\0'; ++i) {
        switch (state)
        {
        case BEGIN:
            if (isalpha(str[i])) {
                state = INWORD;
            }
            else {
                state = OUTWORD;
            }
            break;
        case INWORD:
            if (!isalpha(str[i])) {
                state = OUTWORD;
                num++;
            }
            break;
        case OUTWORD:
            if (isalpha(str[i])) {
                state = INWORD;
            }
            break;
        default:
            break;
        }
    }
    if (state == INWORD) num++;
    return num;
}
int main() {
    cout << getWordNum(" sss sss ss hello ");
}

面向对象+多态实现

场景:公主亲青蛙,青蛙变成王子

当状态发生变化时,青蛙转变为王子

class Creature {
    class State {
    public:
        virtual string response() = 0;
    };
    class Frog : public State {
        string response() {
            return "Ribble";
        }
    };
    class Prince : public State {
        string response() {
            return "Darling";
        }
    };
private:
    State* sp;
public:
    Creature() {
        sp = new Frog();
    }
    void kiss() {
        delete sp;
        sp = new Prince();
    }
    void greet() {
        cout << sp->response() << endl;
    }
    ~Creature() {
        delete sp;
        sp = nullptr;
    }
};
int main() {
    Creature ca;
    ca.greet();
    ca.kiss();
    ca.greet();
}

测试

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

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

相关文章

2.16 SPI协议的4种模式

文章目录1、简介2、SPI通讯模式2.1 模式02.2 模式12.3 模式22.4 模式32.5 总述1、简介 四线控制 SDO - 主设备数据输出&#xff0c;从设备输入 对应MOSI SDI - 主设备数据输入&#xff0c;从设备输出 对应MISO SCLK - 时钟信号&#xff0c;由主设备产生 CS - 从设备使能信号&a…

java接口的静态方法

目前java中已经支持定义静态方法 但需要注意一个点 我们先把代码写出来 我们创建一个包 下面创建一个接口 subInterface 接口参考代码如下 public interface subInterface {static void show2() {System.out.println("来自接口的静态方法");} }这里 我们就将 sho…

【C递归和迭代】兔子繁殖问题、青蛙跳台阶问题和汉诺塔问题

【C递归】前言一、兔子繁殖问题&#xff08;一&#xff09;题目描述&#xff08;二&#xff09;解题1.递归做法&#xff08;1&#xff09;成兔&#xff08;i&#xff09;分析&#xff08;ii&#xff09;代码&#xff08;iii&#xff09;代码分析&#xff08;2&#xff09;幼兔&…

C语言实现简易版扫雷

扫雷对于很多人是一种回忆&#xff0c;那么我们如何用C语言程序去实现它呢&#xff1f;这个是在浏览器找到的一个扫雷游戏我用程序实现它利用到字符数组&#xff0c;将一个类似棋盘的东西打印出来&#xff0c;让人们输入坐标&#xff0c;然后进行扫雷。为了程序的简易我一共设计…

论文阅读-社交媒体上的谣言检测:数据集、方法和机会

论文链接&#xff1a;https://aclanthology.org/D19-5008.pdf 目录 摘要 引言 1.1谣言检测 1.2 问题陈述 1.3 用户立场 2 数据集和评估指标 2.1 数据集 2.2 评价指标 3 特点和方法 3.1使用内容信息的方法 3.2 利用用户信息的方法 3.3 基于传播路径和网络的方法 3.4…

volatile 禁止指令重排序

计算机在执行程序时&#xff0c;为了提高性能&#xff0c;编译器和处理器常常会对指令重排&#xff0c;一般分为以下三种&#xff1a; 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行指令单线程环境里面确保最终执行结果和代码顺序的…

AWS人工智能主题学习月:深度学习入门笔记

目录 一、深度学习入门课程的学习重点&#x1f4d5; 二、简单介绍一下深度学习和神经网络&#x1f4a1; 1.深度学习 2.神经网络 3.深度学习储备知识拓展 三、深度学习生产生活实际案例&#x1f697; 四、深度学习的框架介绍&#x1f333; 总结 深度学习是机器学习中的一…

Arch/Manjaro安装搜狗输入法

装好系统以后&#xff0c;没有输入法&#xff0c;只能打英文的感觉很难受&#xff0c;现在我们来看看如何给Arch系列的系统安装搜狗输入法。 加入Skype Linux群来这里一起解决问题吧&#xff01;腾讯不支持Linux&#xff0c;让我们一起抛弃微信~ Join conversationhttps://join…

⌈ 2022杀青 ⌋ 一个普通人的年终总结,这一年我获得了更多的新鲜体验 | 普通而平凡的一年 | 向前走,走到光里 | 2023你好

&#x1f49b;年度总结&#x1f49b; 时间转瞬便是年末&#xff0c;在此写下告别 成长是一场踏实的幻灭 有哭有笑有酸有甜&#xff0c;失去与获得也同在 即使生活再忙&#xff0c;也不要忘记那些美好治愈我们的瞬间 起起伏伏的日子&#xff0c;这依然是很长很好的一年&…

python 爬虫 使用selenium 控制浏览器 进行搜索操作

首先需要安装selenium&#xff1a; 第一种&#xff1a;可以自己下载selenium tar.gz包&#xff0c;下载到python目录下&#xff1a;解压到当前文件夹 在cmd命令行&#xff1a;进入到解压包中&#xff0c;进行安装。安装完成之后&#xff0c;如果是eclipse中,请 clean project之…

APSIM练习3:氮循环

在本练习中&#xff0c;您将观察休耕情况下的氮肥循环&#xff1b;尿素转化为铵&#xff0c;铵转化为硝酸盐&#xff0c;以及土壤硝酸盐通过反硝化作用流失。此模拟将介绍编辑一个简单的管理器规则以及绘制模拟结果的更多高级功能。 开始基于 Continuous Wheat.apsim 的新模拟。…

【20221230】栈和队列的小结

一、栈&#xff08;stack&#xff09; 栈是先进后出的&#xff08;FILO&#xff09;的数据结构&#xff0c;它只有一个出口。 二、队列 队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;它有两个出口。 栈和队列是STL&#xff08;C标准库&#xff09;里面…

【攻防世界】Web easyupload

知识点讲解 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 关于.user.ini文件是怎么利用的&#xff0c;可以点此查看非常详细&#xff0c;我这里截取一段 .user.ini实际上就是一个可以由用户“自定义”的php.ini&#xff0c;我们能够自定义的设置是模式为“PHP…

创作者身份认证申请规则及审核标准

当前创作者身份主要包括优质创作者、新星创作者、其他&#xff08;特殊情况&#xff09;。 有一些身份认证&#xff0c;比如&#xff1a;企业员工认证、学生认证等&#xff0c;不属于创作者身份认证范畴&#xff0c;申请的时候需要找到对应的认证进行申请&#xff08;https://…

python【多态特性】

多态&#xff1a;同样的行为&#xff08;函数&#xff09;&#xff0c;传入不同的对象&#xff0c;得到不同的状态 特点&#xff1a;通过继承的方式体验抽象动作相同而具体实现细节不同细节的特性 如&#xff0c;定义函数&#xff08;方法&#xff09;&#xff0c;通过类型注…

NetInside帮助IT提高应用性能分析能力(一)

前言 某大学信息中心老师反应&#xff0c;用户反馈科研创新服务器平台有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和…

进销存管理系统哪个比较好?

在如今互联网的刺激之下&#xff0c;企业之间的竞争逐渐加剧&#xff0c;很多企业之所以会逐渐被市场淘汰&#xff0c;主要原因都来源于管理上的混乱&#xff0c;而进销存软件的出现可以帮助企业解决管理难题。 选择一款合适的省心的进销存软件&#xff0c;有效提升企业的核心…

Redis中缓存穿透、击穿、雪崩以及解决方案

缓存穿透 理解&#xff1a; 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和持久层都不会命中。在日常工作中出于容错的考虑&#xff0c;如果从持久层查不到数据则不写入缓存层&#xff0c;缓存穿透将导致不存在的数据每次请求都要到持久层去查询&#xff0c;失去…

【正点原子FPGA连载】第八章使用Vitis开发Linux应用摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第八章使用Vitis…

日本知名汽车零部件公司巡礼系列之株式会社140

株式会社140 业务内容&#xff1a; ・特殊切削工具汽车零件加工用特殊工具的设计、制作・特殊零件海斯、超硬、陶瓷、cBNCD工具的设计与制作・制造用夹具、安装用具、检查用具、定位用具、消耗工具等一制造装饰零件相关的装置或专用机的构成零件等・模具零件制作…钳子、模具…