c++实现状态模式示例
时间: 2023-10-29 16:07:18 浏览: 76
好的,以下是一个简单的状态模式示例:
```C
#include <stdio.h>
// 状态接口
typedef struct State State;
struct State {
void (*handle)(State*);
};
// 具体状态A
typedef struct StateA StateA;
struct StateA {
State state; // 继承自状态接口
int count; // 计数器
};
void StateA_handle(State* super) {
StateA* self = (StateA*) super; // 获取自身
printf("这是状态A,当前计数:%d\n", self->count++);
}
StateA* StateA_new() {
StateA* self = (StateA*) malloc(sizeof(StateA)); // 分配内存
self->state.handle = StateA_handle; // 设置状态处理函数
self->count = 0; // 初始化计数器
return self;
}
// 具体状态B
typedef struct StateB StateB;
struct StateB {
State state; // 继承自状态接口
int count; // 计数器
};
void StateB_handle(State* super) {
StateB* self = (StateB*) super; // 获取自身
printf("这是状态B,当前计数:%d\n", self->count++);
if (self->count == 3) { // 转移状态
free(self); // 释放内存
self = StateA_new(); // 创建新状态对象
}
}
StateB* StateB_new() {
StateB* self = (StateB*) malloc(sizeof(StateB)); // 分配内存
self->state.handle = StateB_handle; // 设置状态处理函数
self->count = 0; // 初始化计数器
return self;
}
// 环境类
typedef struct Context {
State* state; // 当前状态
} Context;
Context* Context_new() {
Context* self = (Context*) malloc(sizeof(Context)); // 分配内存
self->state = (State*) StateB_new(); // 初始化状态为B
return self;
}
void Context_request(Context* self) {
self->state->handle(self->state); // 调用当前状态的处理函数
}
// 测试程序
int main() {
Context* context = Context_new(); // 创建环境对象
for (int i = 0; i < 5; i++) { // 循环调用状态处理函数
Context_request(context);
}
free(context->state); // 释放内存
free(context);
return 0;
}
```
运行结果如下:
```
这是状态B,当前计数:0
这是状态B,当前计数:1
这是状态B,当前计数:2
这是状态A,当前计数:0
这是状态A,当前计数:1
```
阅读全文