状态模式
2015-09-29 22:15
387 查看
概念
State模式也叫状态模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
角色和职责
Context:用户对象
拥有一个State类型的成员,以标识对象的当前状态;
State:接口或基类
封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类
实现了一个与Context某个状态相关的行为。
适用于:对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。
案例
State模式也叫状态模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。
角色和职责
Context:用户对象
拥有一个State类型的成员,以标识对象的当前状态;
State:接口或基类
封装与Context的特定状态相关的行为;
ConcreteState:接口实现类或子类
实现了一个与Context某个状态相关的行为。
适用于:对象的行为,依赖于它所处的当前状态。行为随状态改变而改变的场景。
案例
#include <iostream> using namespace std; #include "string" class Worder; class State { public: virtual void changestate(int hour) = 0; virtual void doSomeThing(Worder *w) = 0; }; class Worder { public: Worder(); void setName(string name) { m_name = name; } string getName() { return m_name; } void changestate(int hour) { m_hour = hour; } int getHour() { return m_hour; } void setState(State *s) { m_currentstate = s; } State * getState() { return m_currentstate; } void doSomeThing() { m_currentstate->doSomeThing(this); // } private: int m_hour; State *m_currentstate; string m_name; }; class State1 : public State { public: void changestate(int hour) { m_hour = hour; } void doSomeThing(Worder *w); private: int m_hour; }; class State2 : public State { public: void changestate(int hour) { m_hour = hour; } virtual void doSomeThing(Worder *w); private: int m_hour; }; void State1::doSomeThing(Worder *w) { if (w->getHour()==7 || w->getHour() == 8) { cout << " 吃早饭" << endl; } else { delete w->getState(); //状态1 不满足 要转到状态2 w->setState(new State2); w->getState()->doSomeThing(w); } } //将要:状态逻辑 和 动作 分离 void State2::doSomeThing(Worder *w) { if (w->getHour()==9 || w->getHour() == 10) //状态2 不满足 要转到状态3 . { cout << "工作 " << endl; } else { delete w->getState(); w->setState(new State1); //恢复到当初状态 cout << "当前时间点:" << m_hour << "未知状态" << endl; } } Worder::Worder() { m_currentstate = new State1; } void main() { Worder *w1 = new Worder; w1->setName("小王"); w1->changestate(7); w1->doSomeThing(); w1->changestate(10); w1->doSomeThing(); delete w1; cout<<"hello..."<<endl; system("pause"); return ; }
相关文章推荐
- 二、设计模式——状态模式
- 详解PHP中的状态模式编程
- C++设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式详解
- Java设计模式之状态模式(State模式)介绍
- 状态模式(未完成) (未看代码,只填了使用场景)
- 无聊之作,RPGdemo制作(一)角色state模式
- 大话设计模式 状态模式
- 设计模式学习笔记——状态模式
- 状态模式
- 状态模式
- 5 设计模式之状态模式(五)
- 有限状态机(使用状态模式C++实现)
- State(状态模式)
- 设计模式之状态模式
- 状态模式lua实现
- 大话设计模式C++实现-第16章-状态模式
- JAVA设计模式之 状态模式【State Pattern】
- [设计模式笔记]三. 行为型模式--22. State模式(状态)对象行为型模式(一)
- 设计模式 - 状态模式(state pattern) 未使用状态模式 详解