上buff——状态模式

状态模式

在这里插入图片描述

状态模式UML

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

#pragma once
#include <iostream>
#include <vector>
#include <string>
#include <Windows.h>

using namespace std;

class Context;

//抽象状态类
class State
{
public:
	virtual void Handle(Context& con) = 0;
};


//当前状态类
class Context
{
public:
	Context(State* s)
	{
		//初始化最初状态
		stat = s;

		//初始化最初时间
		minute = 0;
	}

	void setState(State* s)
	{
		if ((NULL != s) && (NULL != stat))
		{
			delete stat;
			stat = s;
		}
	}

	void setMinute(int m)
	{
		minute = m;
	}

	int getMinute()
	{
		return minute;
	}

	void showCurrentState()
	{
		stat->Handle(*this);
	}
private:
	State* stat;
	int minute;
};


//具体状态3
class Thirt_State : public State
{
public:
	virtual void Handle(Context& con)
	{
		if (con.getMinute() < 10)
			cout << "风暴龙王刷新" << endl;
		else
		{
			cout << "当前时间状态出错" << endl;
		}
	}
};

//具体状态2
class Second_State : public State
{
public:
	virtual void Handle(Context& con)
	{
		if (con.getMinute() < 5)
			cout << "小龙刷新" << endl;
		else
		{
			con.setState(new Thirt_State);
			con.showCurrentState();
		}
	}
};

//具体状态1
class First_State : public State
{
public:
	First_State() {}

	virtual void Handle(Context& con)
	{
		if (con.getMinute() < 0.5)
			cout << "红蓝buff刷新" << endl;
		else
		{
			con.setState(new Second_State);
			con.showCurrentState();
		}
	}
};


int main()
{
	First_State* stat = new First_State;
	Context con(stat);
	con.showCurrentState();

	con.setMinute(4);
	con.showCurrentState();

	con.setMinute(8);
	con.showCurrentState();

	system("pause");
	return 1;
}

使用场景

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

### 如何在 FreeRTOS 中添加和使用环形缓冲区 #### 初始化环形缓冲区 为了能够在 FreeRTOS环境中有效利用环形缓冲区,在实际应用前需先完成其初始化工作。对于特定硬件平台如ESP系列设备而言,可以通过调用`lwrb_init()`函数来创建并配置一个指定大小的环形缓冲区实例[^4]。 ```c #include "lwrb.h" // 定义全局变量用于存储指针以及缓冲数组 static struct lwrb ring_buffer; uint8_t buffer_data[1024]; void setup_ring_buffer(void){ // 对上述声明的对象进行初始化操作,设定缓存空间大小为1KB lwrb_init(&ring_buffer, buffer_data, sizeof(buffer_data)); } ``` #### 数据写入环形缓冲区 当向环形缓冲区内写入数据时,应采用专门设计的数据写入接口以确保线程安全性和高效处理。针对不同的应用场景可以选择同步或异步方式执行此过程;而在FreeRTOS环境下推荐通过任务间通信机制实现这一目标。 ```c BaseType_t write_to_ring_buffer(const uint8_t* data, size_t length){ size_t free_space = 0; // 获取当前可用的空间大小 lwrb_get_free(&ring_buffer, &free_space); if (length > free_space) { // 如果待写入的数据长度超过了剩余空间,则返回错误码 return pdFALSE; } // 将新接收到的信息追加至尾部位置 while(length--){ lwrb_write(&ring_buffer, *data++); } return pdTRUE; } ``` #### 从环形缓冲区读取数据 读取消息的过程同样重要,这通常涉及到检查是否有足够的已接收字节可供提取,并据此调整内部索引来反映最新的状态变化。考虑到实时操作系统特性,这里建议优先考虑非阻塞模式下的即时获取方法以便快速响应外部事件触发的需求。 ```c size_t read_from_ring_buffer(uint8_t* output, size_t max_length){ size_t available_bytes = 0; // 查询现有可读取项的数量 lwrb_get_read_available(&ring_buffer,&available_bytes); if (!available_bytes || !max_length) { return 0; } // 设置期望读取的最大限度不超过现存总量 size_t actual_read_count = available_bytes < max_length ? available_bytes : max_length; // 执行批量取出动作直至达到预设限额为止 for(size_t i=0;i<actual_read_count;++i){ lwrb_read(&ring_buffer,output+i); } return actual_read_count; } ``` 需要注意的是,虽然理论上讲队列可以视为一种增强型环形缓冲结构[^2],但在实践中二者之间仍存在一定差异——前者更侧重于提供先进先出(FIFO)语义保障的同时支持跨上下文访问控制(比如中断服务例程),而后者则往往被优化成适用于连续流式I/O场景下高性能吞吐率要求较高的场合[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值