使用状态模式解决简单的信号转换问题
来源:互联网 发布:决战武林神兵进阶数据 编辑:程序博客网 时间:2024/04/26 16:46
模式说明:允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。
模式图片:
- Context | TLNetTraffic : 包含了不同的状态
- State | TLState : 定义一个状态接口。
- ConcreteState | TL {Red, Yellow, Green} : 定义了不同的状态
¨TLNetTraffic.h¨
123456789
class TLNetTraffic{private:TLState* _state;public:TLNetTraffic();void setState ( TLState* state );void Handle();};
¨TLNetTraffic.cpp¨
1234567891011121314
TLNetTraffic::TLNetTraffic(){_state = new TLRed(this);}void TLNetTraffic::setState ( TLState* state ){_state = state;}void TLNetTraffic::Handle (){_state->Handle();}
TLState.h¨
...我们随意定义了 三种状态,当然可以定义的更多
¨TLRed.h¨
¨TLRed.cpp¨
¨TLGreen.h¨
¨TLGreen.cpp¨
¨TLYellow.h¨
¨TLYellow.cpp¨
原文:12345
class TLState{ public: virtual void Handle() = 0;};
...我们随意定义了 三种状态,当然可以定义的更多
¨TLRed.h¨
123456789
class TLRed: public TLState{private:TLNetTraffic* _context;public:TLRed(TLNetTraffic* context);void Handle();};
¨TLRed.cpp¨
1234567
TLRed::TLRed(TLNetTraffic* context): _context(context) {};void TLRed::Handle(){printf("Red Light\n");_context->setState( new TLGreen(_context) );}
¨TLGreen.h¨
123456789
class TLGreen: public TLState{private:TLNetTraffic* _context;public:TLGreen(TLNetTraffic* context);void Handle();};
¨TLGreen.cpp¨
1234567
TLGreen::TLGreen(TLNetTraffic* context): _context(context) {};void TLGreen::Handle(){printf("Green Light\n");_context->setState( new TLYellow(_context) );}
¨TLYellow.h¨
123456789
class TLYellow: public TLState{private:TLNetTraffic* _context;public:TLYellow(TLNetTraffic* context);void Handle();};
¨TLYellow.cpp¨
1234567
TLYellow::TLYellow(TLNetTraffic* context): _context(context) {};void TLYellow::Handle(){printf("Yellow Light\n");_context->setState( new TLRed(_context) );}
12345678910111213141516171819202122
int main (int argc, char* argv[]){TLNetTraffic netTraffic;int count = 0, i=0;int seconds;while(1){ if (i%3==0) printf("---------\nSession %d\n---------\n", ((i+1)/3)+1 ); if (count == 0) seconds =6, count = 1; else if (count == 1) seconds = 4, count = 2; else if (count == 2) seconds = 5, count = 0; sleep( (clock_t)seconds * CLOCKS_PER_SEC ); netTraffic.Handle(); i++;}return 0;}
http://www.cplusplus.com/articles/zAqpX9L8/
0 0
- 使用状态模式解决简单的信号转换问题
- 状态模式的简单使用
- 状态模式解决灯开关状态问题
- QIconView类clicked()信号问题的解决
- QIconView类clicked()信号问题的解决
- 解决信号跳变的问题
- 关于解决ListCtrl的头标题栏的鼠标状态问题的简单做法
- 使用正则表达式优雅的解决SpringMVC时间转换问题
- Linux信号解决的问题及其遇到的问题
- 分频后的状态转换问题
- (C#)使用队列(Queue)解决简单的并发问题
- 使用队列(Queue)解决简单的并发问题
- 使用观察者模式解决包相互依赖的问题
- Mysql的死锁问题,解决Locked状态
- 解决HTTP无状态的问题
- 解决HTTP的无状态问题
- 状态模式简单实现
- 使用iconv解决JNI字符集转换问题
- HibernateException: Could not obtain transaction-synchronized Session for current thread
- Linux指令--mkdir
- 深入理解PHP7之zval
- Linux下更改目录及其下的子目录和文件的访问权限
- Windows 10下Markdown不能显示预览
- 使用状态模式解决简单的信号转换问题
- 【jQuery】调用trigger()方法手动触发指定的事件
- 黑马程序员--Java编程之多线程
- Java HttpClient解析https时报错Could not generate DH keypair
- iOS语音识别封装
- POJ 2299 Ultra-QuickSort
- CPU L2缓存初探
- keycode值对应键
- Json序列化和反序列化之jackson