访客模式的替代

时间:2018-06-05 17:59:28

标签: c++ design-patterns visitor-pattern

访问者模式的一个已知问题是,它不能很好地扩展到丰富的类层次结构(即使您不经常添加类)。

当您将访客模式与命令模式组合时,将打开地狱门。您的访问者界面现在必须支持您的层次结构的所有类型,这可能是不可取的。

例如,您可能希望将命令分为以下类别:

class CarCommands
{
protected:
        enum TypeOfCommands : uint8_t
        {
                RadioCommands,
                EngineCommands,
                WindowsCommands,

                MaxCarCommands
        };

        uint8_t cmd_type;
};

从那里,你写了你的supreclasses:

class RadioCmd : CarCommands
{
public:
    RadioCmd() : CarCommands(RadioCommands)
    {}

    // Other radio-specific methods
    ...
    // Other radio-specific data members
    ...
protected:
    enum TypeOfRadioCmd : uint8_t
    {
        Radio_ON,
        Radio_OFF,

        MaxRadioType
    };

    uint8_t radio_type;
};

class EngineCmd : CarCommands
{
pubilc:
    EngineCmd() : CarCommands(EngineCommands)
    {}
protected:
    enum TypeOfEngineCmd : uint8_t
    {
        Engine_Start,
        Engine_Accelerate,
        Engine_Stop,

        MaxEngineType
    };

    uint8_t engine_type;
};

为每个类别设置一个处理程序是很自然的。如果我想处理与引擎相关的命令,我的EngineCommandHandler应该不知道其他类型的CarCommands。因此,如果我决定添加另一个引擎命令,我只需要修改EngineCommandHandler以支持它。同时,CarCommandHandler应该能够正确处理AccelerateEngine命令。

是否有访客模式的替代方案可以使用大型层次结构进行扩展? 鉴于问题,是否有另一种设计模式适用于访客模式

0 个答案:

没有答案