鱼儿慢慢游~~

导航

 

状态模式: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();

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

posted on 2016-06-30 22:00  miss_UU  阅读(207)  评论(0编辑  收藏  举报