《设计模式》之状态模式

news2024/11/23 2:52:52

文章目录

    • 1、定义
    • 2、动机
    • 3、类结构
    • 4、优点
    • 5、总结
    • 6、代码实现(C++)

1、定义

允许一个对象在其内部改变时改变它的行为,从而使对象看起来改变了其行为。

2、动机

  1. 某些对象的状态如果改变,其行为也会随之而发生改变。比如文档的只读状态和读写状态的行为可能完全不同。

3、类结构

在这里插入图片描述
State类:抽象状态类,封装状态行为对应的接口。
StateA、StateB和StateC类:每个类对应一种具体的状态。
Context类(即状态管理类):客户端与状态类上下文类,提供客户需要的接口。封装状态的具体变化逻辑。

4、优点

  1. 封装转换过程,也就是转换规则
  2. 枚举可能的状态,因此需要事先确定状态种类

5、总结

  1. State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对
    象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
  2. 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转
    换是原子性的——即要么彻底转换过来,要么不转换。
  3. 如果State对象没有实例变量,那么各个上下文可以共享一个State对象,从而节省对象开销。

6、代码实现(C++)

状态模式源代码实现

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

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

相关文章

【MySQL】- 04 MVCC实现原理

MVCC的实现原理 隐式字段undo日志Read View(读视图)整体流程例子 MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。…

Linux笔记-so.1和so的区别(三方程序链接Qt的so.1和so)

如下面这个程序使用ldd查看下: 从中可以看到一些so.6和so.1这些,这些其实是版本号,比如这个:/lib64/libstdc.so.6 可见so.版本号其实是个软连接,最终会连接到/lib64/libstdc.so.6.0.19 而CQt框架写的lib如下pro文件会生…

磁盘配额与进阶文件系统管理(一)

磁盘配额Quota 用途 针对www server,例如 每个人网页空间的容量限制;针对mail server,例如 每个人的邮件空间限制;针对file server,例如 每个人最大可用的网络硬盘空间;限制某一群组所能使用的最大磁盘空…

使用zerotier进行内网穿透,外网访问其它电脑上的虚拟机

目标 使用一台电脑,使用vmware创建三台虚拟机,处于同一网段。另一台电脑外网进行访问其虚拟机 用途 学习K8s集群,由于个人财力有限,云服务器买不了几台,而且不同厂家的云服务器无法做到内网互通 完成后缺陷 使用z…

nginx系统优化和内核优化

nginx系统优化 一:隐藏nginx版本号 方法一:修改配置文件 vim /usr/local/nginx/conf/nginx.confnginx -t systemctl restart nginx curl -I http://192.168.52.108方法二:修改源代码 vim /opt/nginx-1.24.0/src/core/nginx.h ##配置文件里…

逆向汇编与反汇编——汇编基础快速入门

一、常用32位寄存器介绍 不同位数的寄存器的名称: eax:累加寄存器。通常用于算数运算,将结果保留在eax当中,当然也可以用于其他用途,比如一般把返回值通过eax传递出去。 ebx:基址寄存器 。有点类似于ebp…

Go语言日志库logrus

Go语言日志库logrus 1、介绍 logrus logrus是目前Github上star数量最多的日志包,功能强大、性能高效、高度灵活,还提供了自定义插件的功能。很 多优秀的开源项目,例如:docker、prometheus等都使用了logrus。logrus除了具有日志…

VMware nat模式配置

使用nat模式,需要配置ip才能做到虚拟机与主机、外网正常通信 步骤 1 选择虚拟机设置,将网络连接改为nat模式 2 查看主机vmware network adpter vmnet8 打开控制面板。选择网络连接,右击vmnet8,打开属性 选择ip4,双击…

kubesphere插件,应用商店,应用仓库

应用商店 参考 步骤 以platform-admin角色的账号(admin)登录kubesphere点击右上角 “平台管理”点击“集群管理”点击 “自定义资源 CRD”搜索 clusterconfiguration点击 ClusterConfiguration点击 ks-installer 右侧的三个点,点击“编辑文件”在YAML 文件中&…

Linux进程间通信【匿名管道】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、进程间通信相关概念1.1、目的1.2、发展1.3、分类 2、什么是管道&#xff1…

Redi事务,数据持久化

4.其他数据功能 4.1pubsub发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下面示例展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— c…

旧改周报--深圳7大项目获进展:中海、星河等主导

2023年第22周,深圳市共发布拆除重建类权利人核实公示1项,规划公告1项,规划修改(草案)公示2项,规划(修改)公告1项,实施主体公示1项,建设用地批复1项&#xff0…

win7安装visual studio 2015出现安装包丢失或损坏

winr 输入 certmgr.msc 查看有没有选中的两个证书,如果没有需要从其他电脑导入,然后直接点击安装界面重试,即可继续安装

【SpringMVC】RESTful案例

1、Rest风格 对于Rest风格,我们需要学习的内容包括: REST简介REST入门案例REST快速开发案例:基于RESTful页面数据交互 1. REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示…

优秀的测试开发应该具备的六大能力有哪些?

目录 前言 什么是测试开发工程师? 测试开发的六大能力 前言 从我工作中接触到的测试开发,以及面试测试开发候选人时问的问题,我将自己对测试开发这个岗位的理解,总结了如下六点能力。 我个人认为,具备如下六点能力…

数据结构之二叉树,实现二叉树的创建与遍历,以及二叉树的一些练习题

目录 目录 一、二叉树的创建与遍历 1.创建二叉树 构建出来的树如图: 2.二叉树的销毁 3.二叉树的前序遍历[Leetcode144.力扣] 4.二叉树的中序遍历 5.二叉树的后序遍历 二、二叉树的实现 1.获取树中节点的个数 2.获取叶子节点的个数 3.获取第K层节点的个数…

Redis实现分布式锁的原理:常见问题解析及解决方案、源码解析Redisson的使用

0、引言:分布式锁的引出 锁常常用于多线程并发的场景下保证数据的一致性,例如防止超卖、一人一单等场景需求 。通过加锁可以解决在单机情况下安全问题,但是在集群模式下就不行了。集群模式,即部署了多个服务器、并配置了负载均衡后…

记录使用Echarts-gl实现3D地图

一、前言 最近项目需要做个大屏展示的,开始做了第一版用户觉得地图太过于单调了,给我发了一个视频,让我参考着做。我看着视频上的地图旋转了方向、地图有标记、看着像是3D的(视频上的地图使用多个图层叠加起来、CSS样式做了旋转&…

Nginx网络服务——location规则与rewrite重写

Nginx网络服务——location规则与rewrite重写 一、Nginx中location与rewrite1.location与rewrite常用的正则表达式2. location与rewrite的联系和区别 二、location的匹配规则1.location 的匹配分类2.location 常用的匹配规则3.location 优先级4.location匹配规则优先通用的总结…

【知识图谱搭建到应用】--知识存储--04

文章目录 Mysqljenafuseki数据存储数据建模数据映射注意事项 py2neoneo4jPy2neo与Neo4j的版本问题Py2neo导入三元组数据批量导入csv文件 rdflib库 前面几篇在讲述骗理论的内容,本片主要描述如何将清洗过的结构化数据存储在转换成三元组并存储起来,并于后…