C++实现状态模式

下面我们开始一个新的类型系列模型。

1. 情景与意图

  一个对象可以有很多的状态,不同的状态,对象就会有不同的行为。比如文件如果是只读的状态,那么就只能读不能写入,如果是只写的,那就不能读,再或者是读写的。在对象的状态改变时,其可以支持的行为也应该改变。
  如何实现这个设计——状态模式。

2. 状态模式

  允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  其实就是说,不同状态不同行为切换。行为可以是表现形式,支持的时间等等。

3. 文件的状态

  下面我们简单的实现一个场景。比如我们知道网络有WiFi,蜂窝,等等,对于应用程序来说,是离不开网络请求的。此时我们对于当前APP的网络状态做一个状态模式的实现。
  状态模式的实现,就是将枚举的状态,抽象成对象。首先我们先定义状态。

class Context;
class DPNetworkState {
public:
	virtual void doAction(Context& context) = 0;
	virtual std::string descriptionString() = 0;
};

class DPNetworkStateWIFI : public DPNetworkState {
public:
	virtual void doAction(Context& context);
	virtual std::string descriptionString();
};

class DPNetworkStateCellular : public DPNetworkState {
public:
	virtual void doAction(Context& context);
	virtual std::string descriptionString();
};

class DPNetworkStateUnknow : public DPNetworkState {
public:
	virtual void doAction(Context& context);
	virtual std::string descriptionString();
};

// 举例其中一个具体实现
std::string DPNetworkStateWIFI::descriptionString() {
	return std::string("wifi");
}
void DPNetworkStateWIFI::doAction(Context& context) {
	context.setNetworkState(this);
}

下面就是具有这些状态的具体对象,会根据状态的改变,改变其行为。

class Context {
protected:
	DPNetworkState* _networkState;
public:
	void setNetworkState(DPNetworkState* networkState);
	void printState();
};

来看看具体表现

int main() {
	Context context;
	DPNetworkState* state = new DPNetworkStateWIFI();
	state->doAction(context);
	context.printState();

	state = new DPNetworkStateCellular();
	state->doAction(context);
	context.printState();

	state = new DPNetworkStateUnknow();
	state->doAction(context);
	context.printState();

	return 0;
}

4. 总结

  状态模式就是先将状态抽象,然后将与状态关联的行为放在子状态类中,再状态切换时,切换与之相应的对象,只是维护一个抽象的接口。看着像对象内部在改变。
  状态一定就是项目’网络demo‘的这种离散的,还有一种是有关联的状态的改变,比如状态变化后,到达另一个状态等。具体例子不在这里展示,见下方源码。
C++实现状态模式源码:【状态模式C++实现】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的状态模式示例: ```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 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值