访问者模式的一个已知问题是,它不能很好地扩展到丰富的类层次结构(即使您不经常添加类)。
当您将访客模式与命令模式组合时,将打开地狱门。您的访问者界面现在必须支持您的层次结构的所有类型,这可能是不可取的。
例如,您可能希望将命令分为以下类别:
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
命令。
是否有访客模式的替代方案可以使用大型层次结构进行扩展? 鉴于问题,是否有另一种设计模式适用于访客模式?