C++设计和多态

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更具可读性,因为所有类型都以相同的方式执行.