论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
物联网
›
物联网
›
行为模式---状态模式
行为模式---状态模式
祗疼妳一个
金牌会员
|
2025-3-12 06:29:01
|
显示全部楼层
|
阅读模式
楼主
主题
947
|
帖子
947
|
积分
2843
概念
状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态的改变而改变,使其看上去就像是类的一个属性一样。
适用场景
1、假如对象必要根据不同的状态进行不同的利用的,且状态较多而且代码必要复用的时,必要使用到状态模式。
2、假如某个类必要根据成员的状态改变自身的行为且必要大量的条件判定语句的时,可以使用该模式。
3、当相似的状态和基于条件的状态机转换中存在许多重复代码的时候,可以使用状态模式。
创建方式
1、使用状态模式的时候必要起首创建一个状态类、上下文类。
2、创建一个状态类接口对象,在这个接口对象中必要创建一个上下文指针对象,并创建一个设置上下文的接口和所有的状态利用函数。
3、创建现实的状态类对象,在现实的状态类对象实现具体的利用函数方法,在此方法中实现状态的切换。
4、实现上下文类,在上下文状态类中实现状态类的指针对象引用,并实现一个切换函数在此函数中将当前状态设置给当前上下文。然后实现上下文的利用函数。在上下文的利用函数中通过状态引用对象调用状态的利用函数。
5、在客户端的使用的时候,起首创建一个初始转台对象,之后创建一个上下文对象,并将状态对象设置个上下文,之后通过调用上下文中的利用函数进行状态切换和状态的利用函数。
类关系图
示例代码
#include "ZhuangTaiMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
//创建状态
StateBase* state1 = new State1();
StateBase* state2 = new State2();
//创建上下文对戏
Context* context = new Context();
context->switchState(state1);
context->deputeHandle1();
context->deputeHandle2();
context->switchState(state2);
context->deputeHandle1();
context->deputeHandle2();
}
复制代码
#pragma once
#include <string>
#include <iostream>
using namespace std;
class Context;
//状态接口类
class StateBase
{
public:
StateBase() {}
~StateBase() {}
virtual void handle1() {}
virtual void handle2() {}
};
//具体状态接口类
class State1 : public StateBase {
public:
State1() {}
~State1() {}
void handle1() {
cout << "状态1操作函数1:第一队右侧迂回" << endl;
}
void handle2() {
cout << "状态1操作函数2:第而队左侧突击" << endl;
}
};
class State2 : public StateBase {
public:
State2() {}
~State2() {}
void handle1() {
cout << "状态2操作函数1:先锋队冲锋" << endl;
}
void handle2() {
cout << "状态2操作函数2:狙击手掩护" << endl;
}
};
//上下文对象类
class Context {
public:
Context() {}
~Context() {}
void switchState(StateBase* state) {
m_state = state;
}
void deputeHandle1() {
m_state->handle1();
}
void deputeHandle2() {
m_state->handle2();
}
private:
StateBase* m_state = nullptr;
};
复制代码
欢迎东哥来到设计模式的世界!
状态1操作函数1:第一队右侧迂回
状态1操作函数2:第而队左侧突击
状态2操作函数1:先锋队冲锋
状态2操作函数2:狙击手掩护
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
祗疼妳一个
金牌会员
这个人很懒什么都没写!
楼主热帖
容斥原理
信息收集之 端口扫描
高考是人生旅途的一处驿站
教你30分钟快速搭建直播间
ASP.NET Core依赖注入系统学习教程:Se ...
Java EnumMap get()方法具有什么功能呢 ...
【C++】拷贝构造函数的调用时机 ...
多态详解
JetBrains RubyMine 2022 for Mac(Ruby ...
java运算符(超详细!!!) ...
标签云
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表