MGH*_*MGH 5 c++ polymorphism design-patterns
我对C++类设计有一个通用的问题.例如,我需要一个数据包生成器.因此,给定一种类型的数据包,我必须生成该类型的数据包.所以我有一个基础数据包生成器类.
方法1:
class BasePacketGenerator {
public:
virtual Packet* generatePacket (int type); // implements the generic case
// hence not pure virtual
protected:
//
// Common functionality for all types
//
virtual void massagePacket (Packet& pkt); // called by generatePacket
// but needs special handling for
// some types
virtual void calculateCheckSum(Packet& pkt); // called by generate packet
...
};
Run Code Online (Sandbox Code Playgroud)
派生类来处理每种类型:
class Type1PacketGenerator : public BasePacketGenerator {
public:
// Dont have to override any base class implementationa
protected:
void calculateCheckSum(Packet& pkt) override;
};
class Type2PacketGenerator : public BasePacketGenerator {
public:
Packet* generatePacket(int type) override;
};
Run Code Online (Sandbox Code Playgroud)
这里对于Type1生成器,我们使用多态.但是基类调用,派生类的功能是多态的.我想知道这是不是一个好习语?或者应该有一个中间人类
方法2:
class TypeHandler {
virtual Packet* setupPacket();
virtual void calculateCheckSum(Packet& pkt);
virtual void setupFields (Packet& pkt);
}
class PacketGenerator {
public:
TypeHandler *handler_; // lets say this is setup based on the type
Packet* generatorPacket(int type)
{
auto packet = handler_->setupPacket();
handler_->massagePacket();
handler_->calculateCheckSum(*packet);
return packet;
}
}
Run Code Online (Sandbox Code Playgroud)
采用一种方法或另一种方法是否有任何优势?
Approach1更灵活,因为它不必遵循相同的做事方式.例如:如果Type2Generator不需要校验和,它甚至不需要调用calculateCheckSum(),或者如果它需要一些额外的功能,我们不必将它添加到所有的Type生成器.
但是方法2更具可读性,因为所有类型都以相同的方式执行.