• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
onlyan
#define true false                  
博客园    首页    新随笔    联系   管理    订阅  订阅

状态模式(State)

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

 

以下为电梯的上下运动的例子:

//State.h
class Elevator;

//状态基类
class State		
{
public:
	State() {}
	virtual void Move(Elevator *elevator);		//电梯运动
};

//电梯类
class Elevator
{
private:
	State *state;
public:
	Elevator(State *state);
	void SetState(State *state);				//设置电梯状态
	void Request();								//电梯状态改变的请求
};

//电梯向上状态
class UpState: public State
{
public:
	UpState() {}
	virtual void Move(Elevator *elevator);		//电梯向上运动
};

//电梯向下状态
class DownState: public State
{
public:
	DownState() {}
	virtual void Move(Elevator *elevator);		//电梯向下运动
};

  

//State.cpp
#include "State.h"
#include <iostream>
using namespace std;

Elevator::Elevator(State *state)
{
	this->state = state;
}

void Elevator::SetState(State *state)
{
	this->state = state;
}

void Elevator::Request()
{
	state->Move(this);
}

void State::Move(Elevator *elevator)
{
	cout << "State Move" << endl;
}

void UpState::Move(Elevator *elevator)
{
	cout << "UpState Move" << endl;
	State *state = new DownState();
	elevator->SetState(state);
}

void DownState::Move(Elevator *elevator)
{
	cout << "DownState Move" << endl;
	State *state = new UpState();
	elevator->SetState(state);
}

int main()
{
	State *state = new UpState();
	Elevator elevator(state);
	elevator.Request();
	elevator.Request();
	elevator.Request();
	elevator.Request();
	return 0;
}

  

状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割来来。

状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可以考虑使用状态模式。

posted @ 2012-06-30 20:43  onlyan  阅读(266)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3