实战设计模式系列-State(状态)
时间:2022-06-05
本文章向大家介绍实战设计模式系列-State(状态),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【需求分析】
state模式中,我们将状态逻辑和动作实现进行分离,当一个操作中要维护大量的case分支语句的时候,并且这些分支也都要依赖于对象的状态时,state模式将每一个分支都封装到独立的类中实现。不同的事物在不同的状态下会有不同的动作,在一个状态下又会转移到下一个状态。
以TCP状态处理为例,TcpConnection只负责独立的业务逻辑,而TcpState负责业务逻辑转换和组合的业务逻辑,如TcpConnection会提供创建socket、监听接口,而TcpState业务从Close状态转换到Listen转换时,会调用TcpConnection类的创建socket和监听接口,这一点,也是通过在TcpConnection中声明TcpState为友元实例的。
下面的例子给出了代码实例,在main函数中,只要接收到请求,直接调用HandleRequest即可,而不用关心当前的TCP连接状态。
【代码示例】
/*
* state.h
*//*
* state.h
*/
#include <stdio.h>
#include <stdlib.h>
class TcpState;
class TcpConnection
{
public:
TcpConnection(TcpState* instance);
~TcpConnection();
public:
void HandleRequest();
void ChangeState(TcpState* instance);
public:
void CreateSocket()
{
printf("CreateSocket/n");
}
void BeginListen()
{
printf("BeginListen/n");
}
void Accept()
{
printf("Accept/n");
}
void Establish()
{
printf("Establish/n");
}
void Close()
{
printf("Close/n");
}
private:
friend class TcpState;
TcpState * m_instance;
};
class TcpState
{
public:
virtual ~TcpState(){};
public:
virtual void Handle(TcpConnection* pTcpConnection){};
};
class TcpCloseState : public TcpState
{
public:
void Handle(TcpConnection* pTcpConnection);
};
class TcpListenState : public TcpState
{
public:
void Handle(TcpConnection* pTcpConnection);
};
class TcpEstablishState : public TcpState
{
public:
void Handle(TcpConnection* pTcpConnection);
};
/*
* state.cpp
*/
#include "state.h"
TcpConnection::TcpConnection(TcpState* instance)
{
m_instance = instance;
}
TcpConnection::~TcpConnection()
{
delete m_instance;
m_instance = NULL;
}
void TcpConnection::HandleRequest()
{
if (NULL == m_instance)
{
return;
}
m_instance->Handle(this);
}
void TcpConnection::ChangeState(TcpState* instance)
{
m_instance = instance;
}
void TcpCloseState::Handle(TcpConnection* pTcpConnection)
{
//create socket and begin listen
pTcpConnection->CreateSocket();
pTcpConnection->BeginListen();
//change state
pTcpConnection->ChangeState(new TcpListenState());
}
void TcpListenState::Handle(TcpConnection* pTcpConnection)
{
//accpet and set establish
pTcpConnection->Accept();
pTcpConnection->Establish();
//change state
pTcpConnection->ChangeState(new TcpEstablishState());
}
void TcpEstablishState::Handle(TcpConnection* pTcpConnection)
{
//close
pTcpConnection->Close();
//change state
pTcpConnection->ChangeState(new TcpCloseState());
}
int main(void)
{
TcpState * pState= new TcpCloseState();
TcpConnection * pTcpConn = new TcpConnection(pState);
pTcpConn->HandleRequest();
pTcpConn->HandleRequest();
pTcpConn->HandleRequest();
delete pTcpConn;
return 0;
}
【执行结果】
root:/home/derrywang#g++ -o state state.cpp root:/home/derrywang#./state CreateSocket BeginListen Accept Establish Close
- 使用Nginx代理restful实现SSL链路加密
- 使用Nginx代理thrift NIO实现SSL链路加密
- TThreadedSelectorServer介绍及Direct Memory OOM分析
- 通过Java程序提交通用Mapreduce任务并获取Job信息
- Mapreduce 任务提交源码分析1
- Java分布式神经网络库Deeplearning4j 环境搭建和运行一个例子
- Java分布式神经网络库Deeplearning4j之上手实践手写数字图像识别与模型训练
- 调用腾讯优图开放平台进行人脸识别-Java调用API实现
- Spring的事务传播行为
- Jquery 获取checkbox属性checked为undefined和改变状态 值不变
- Hibernate--Criteria Query and DetachedCriteria
- Python3 大作战之 encode 与 decode 讲解
- SpringMVC 文件下载时 浏览器不能正确显示另存的文件名
- 手把手教你用python抢火车票
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案
- 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)
- 6个提升效率的pandas小技巧
- 如何用 Python 让微博热搜榜动起来
- 如何用 Python 让微博热搜榜动起来
- 漫画:什么是 “抽象工厂模式” ?
- 5个很常用的CSS3网页小实例
- 收藏!!!学习Matplotlib看这一份笔记就够了!
- 最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)
- Selenium 系列篇(六):反反爬篇
- Selenium 系列篇(五):文件篇
- 腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册
- Selenium 系列篇(四):JS 篇
- 【5分钟玩转Lighthouse】家乡的战疫
- Kubernetes 源码学习之延时队列