zoukankan      html  css  js  c++  java
  • 设计模式之状态模式

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

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

    ~~~~~
  • 相关阅读:
    分组与子报表Active Report6 使用(二)
    网站开发人员应该知道的62件事[转]
    如何恢复SVN中已删除文件或文件夹
    java中的List排序[转]
    [原]ActiveReport6 for net使用(一)
    Windows XP 不用输入密码自动登录
    IE不加载ActiveX控件的解决办法
    winRAR 打包小技巧
    iis负载均衡与文件同步[网摘]
    ASP.net的PDF打印(水晶报表)[摘]
  • 原文地址:https://www.cnblogs.com/missmzt/p/5631380.html
Copyright © 2011-2022 走看看