状态模式
来源:互联网 发布:打开数据连接无法上网 编辑:程序博客网 时间:2024/05/29 12:36
概念
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 ;}
0 0
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 友元实例:友元类及友元函数
- 观影会
- LCD——画线函数Glib_Line算法
- 夕拾-数据结构-快速排序
- Spark学习之路
- 状态模式
- 基本算法
- B\S备忘录番外篇——啊!这是一篇总结!
- 偏微分方程图像处理——基于热方程的图像去噪
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的...
- Lecture5-2Effective number of lines
- bzoj-2741 L
- 03.C语言Scanf函数
- 常用的Javascript表单正则验证函数