设计模式之状态模式
Posted 鱼儿慢慢游~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之状态模式相关的知识,希望对你有一定的参考价值。
状态模式:state
定义:当一个对象内部状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
例子:
设计模式一书中,举了TCP状态转移的例子。比如tcp连接在listen状态收到syn,并发送syn+ack时,进入syn receive 状态。当在syn receive状态收到ack 则进入established状态,在普通的程序中,则需要大量的if else 或者switch 来判断收到的命令,以及进行相应的状态变迁。
如:
if (stat == listen)
if (receive syn and send syn,ack)
stat = established
else......
状态模式主要解决此类问题。当控制一个对象状态转换的条件表达式过于复杂时,
把状态转换的判断逻辑转移到表示不同状态的一系列类中。可以把复杂的逻辑简单化。
状态模式的类图:
state类: 抽象的状态类,定义接口用来封装和context类特定状态相关的行为。
concertState: 具体的状态类,每个子类实现了与Context状态相关的行为。
context: 维护一个state类的实例,这个实例表示当前的状态。
tpc 状态转移的程序可以设计如下:
1 class TcpConn 2 { 3 public: 4 TcpConn(); 5 void listen(){ _stat->listen(this); 6 void synReceived(); 7 ...... 8 void setState(TcpStat* state){ _state = state;} 9 private: 10 TcpState* _state; 11 }; 12 13 class TcpState 14 { 15 piblic: 16 virtaul void changeStae(TcpConn *conn); 17 virtaul void listen(TcpConn* conn); 18 virtaul void synReceived(TcpConn* conn); 19 }; 20 21 class TcpListenState : public TcpState 22 { 23 virtual void listen(TcpConn* conn) 24 { 25 //receive ayn send ack and syn 26 conn.setState(new TcpSynReceivedState()); 27 } 28 } 29 30 31 client: 32 TcpConn* conn = new TcpConn; 33 conn->listen();
当一个对象的行为取决于它的状态,并且它必须根据状态改变自己的行为时,考虑使用状态模式。
以上是关于设计模式之状态模式的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段