灵活的设计,以取代开关声明

cod*_*ons 5 c++ networking

我正在研究网络程序并使用C++设计Linux服务器.设计基本结构非常简单.我有一个数据包定义,其头部具有固定的大小.

typedef enum{
     PACKET_LOGIN_REQ = 1,
     PACKET_LOGIN_RES,
     PACKET_STORE_REQ,
     PACKET_STORE_RES
}PACKET_TYPES;

typedef struct {
     PACKET_TYPES type;
     short bodySize,
     long long deviceId
}HEADER;

.
.

/*more definitions here*/

typedef struct{
     HEADER head;
     union BODY{
          LOGIN_REQ loginReq;
          LOGIN_RES loginRes;
          .
          .
          more types
     }
}
Run Code Online (Sandbox Code Playgroud)

每当我添加更多数据包类型时,我都必须修改switch语句以添加更多情况来处理新添加的数据包.

我正在使用union类型,所以我不必更改整个数据包结构.相反,我可以将新添加的数据包类型添加到联合结构中.

但是,当我尝试使用switch语句解析原始数据以放入数据包时,我必须每次都添加每个switch语句.

我认为这不是一个好的设计模式,我想知道如何以更灵活的方式设计结构.

有没有更好的方法来处理这个问题(更好的设计模式)?相关的教程或参考怎么样?

lit*_*adv 7

您应该使用类而不是switch使用多态调用.

类似的东西(伪编码):

class Packet{
public:
   Packet();
   virtual ~Packet();
   virtual HandleMe()=0;
protected:
   // fields 
}

PacketTypeOne: public Packet{
public:
  virtual HandleMe(); // implementation for type 1
}

PacketType2: public Packet{
public:
  virtual HandleMe(); // implementation for type 2
}

PacketTypeX: public Packet{
public:
  virtual HandleMe(); // implementation for type X
}
Run Code Online (Sandbox Code Playgroud)

并在哪里获得数据包:

...
Packet* newPacket = PacketFactory::CreateNewPacket(packetTypeX); // factory will create
              // the right instance.
...
// now handle it:
newPacket->HandleMe();
...
Run Code Online (Sandbox Code Playgroud)

完成.