当前位置: 首页 > news >正文

Linux C++ 055-设计模式之状态模式

Linux C++ 055-设计模式之状态模式

本节关键字:Linux、C++、设计模式、状态模式
相关库函数:

概念

状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。

优缺点

优点

1、封装状态转换规则:将状态转换逻辑封装在状态对象内部。
2、易于扩展:增加新的状态类不会影响现有代码。
3、集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。
4、简化条件语句:避免使用大量的条件语句来切换行为。
5、状态共享:允许多个上下文对象共享同一个状态对象。

缺点

1、增加类和对象数量:每个状态都需要一个具体的状态类。
2、实现复杂:模式结构和实现相对复杂。
3、开闭原则支持不足:增加新状态或修改状态行为可能需要修改现有代码。

使用场景

1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2、一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

当对象的行为随状态改变而变化时,考虑使用状态模式。状态模式适用于替代复杂的条件或分支语句。

角色说明

状态模式包含以下几个主要角色:

上下文(Context):定义了客户感兴趣的接口,并维护一个当前状态对象的引用。上下文可以通过状态对象来委托处理状态相关的行为。

状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。

具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。

代码示例

//头文件
#include <iostream>
using namespace std;class Context;
// 抽象出来的状态类
class State
{
public:/* 抽象的接口,每个子类去实现这个接口根据自己的逻辑执行任务或者转换状态。*/virtual void Handle(Context *context) = 0;// 获得当前的状态virtual void GetState() = 0;
};// 状态管理类
class Context
{
public:// 初始化状态Context(State *state) {m_pState = state;}// 获得当前的状态State* GetState() {return m_pState;}// 改变当前的状态void SetState(State *state){m_pState = state;}// 执行状态类实现的方法void Request() {m_pState->Handle(this);}State* m_pState;
};
// 具体的状态子类
class ConcreteStateA:public State
{
public:void Handle(Context *context);void GetState();
};
// 具体的状态子类
class ConcreteStateB:public State
{
public:void Handle(Context *context);void GetState();
};
// 具体的状态子类
class ConcreteStateC:public State
{
public:void Handle(Context *context);void GetState();
};// cpp文件
#include "StateMode.h"
void ConcreteStateA:: Handle(Context *context)
{context->m_pState = new ConcreteStateB;cout<<"当前状态是A,下一状态是B"<<endl;
}
void ConcreteStateB:: Handle(Context *context)
{context->m_pState = new ConcreteStateC;cout<<"当前状态是B,下一状态是C"<<endl;
}
void ConcreteStateC:: Handle(Context *context)
{context->m_pState = new ConcreteStateA;cout<<"当前状态是C,下一状态是A"<<endl;
}
void ConcreteStateA:: GetState()
{cout<<"当前状态是A"<<endl;
}
void ConcreteStateB:: GetState()
{cout<<"当前状态是B"<<endl;
}
void ConcreteStateC:: GetState()
{cout<<"当前状态是B"<<endl;
}
int main(int argc, char *argv[])
{// 初始化A状态Context* context = new Context(new ConcreteStateA);context->Request();context->Request();context->Request();getchar();return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React 的生命周期方法有哪些?
  • [论文笔记]构建基于RAG聊天机器人的要素
  • pycharm2020 相比pycarm2017更新内容
  • redis安装,启动客户端、验证(redis第一次作业)
  • 深入Laravel的魔法核心:依赖注入的工作原理
  • 智慧煤矿:AI视频智能监管解决方案引领行业新变革
  • 【Java】:浅克隆和深克隆
  • Java设计模式的7个设计原则
  • [计算机基础]一、计算机组成原理
  • 在 Windows 上开发.NET MAUI 应用_1.安装开发环境
  • Excel办公技巧:制作二级联动下拉菜单
  • Python excel知识库批量模糊匹配的3种方法实例(fuzzywuzzy\Gensim)
  • 开启你的 Django 开发之旅:从环境搭建到服务部署
  • 保障低压设备安全!中国星坤连接器精密工艺解析!
  • tomcat如何进行调优?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • bootstrap创建登录注册页面
  • echarts花样作死的坑
  • ESLint简单操作
  • Fabric架构演变之路
  • Sass 快速入门教程
  • webpack入门学习手记(二)
  • 初识 webpack
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端相关框架总和
  • 前端之Sass/Scss实战笔记
  • 实习面试笔记
  • 移动端 h5开发相关内容总结(三)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • (14)Hive调优——合并小文件
  • (152)时序收敛--->(02)时序收敛二
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (利用IDEA+Maven)定制属于自己的jar包
  • (算法设计与分析)第一章算法概述-习题
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET MVC之AOP
  • .NET NPOI导出Excel详解
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .Net多线程总结
  • .Net环境下的缓存技术介绍
  • .net专家(张羿专栏)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @Transactional 参数详解
  • [AIGC] Spring Interceptor 拦截器详解
  • [BIZ] - 1.金融交易系统特点
  • [C/C++]数据结构 循环队列
  • [CareerCup] 14.5 Object Reflection 对象反射