我正在研究网络程序并使用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语句.
我认为这不是一个好的设计模式,我想知道如何以更灵活的方式设计结构.
有没有更好的方法来处理这个问题(更好的设计模式)?相关的教程或参考怎么样?
您应该使用类而不是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)
完成.