【发布时间】:2018-05-28 14:40:39
【问题描述】:
我正在尝试学习基于策略的类设计。现在我有一个案例,即 2 个不同的策略类实现 相互依赖。这意味着,第二个策略实现(GLFWInputHandler)取决于特定的内部 第一个实现(GLFWVideoModeSetter)。也就是说,因为视频模式设置和输入处理在内部 使用 GLFW 框架实现。 InputHandler 需要一个具体的 glfwWindow,它由 VideoModeSetter 创建。
首先,这是一个最小的、可编译的示例 两个策略类实现之间没有依赖关系。 这里一切都很好。
struct GLFWVideoModeSetter { void setVideoMode() {} };
template <class VideoModeSettingPolicy>
struct VideoModeManager : public VideoModeSettingPolicy {};
struct GLFWInputHandler { bool handleKeys() { return true; } };
template <class InputHandlerPolicy>
struct InputHandlerManager : public InputHandlerPolicy { };
int main()
{
VideoModeManager<GLFWVideoModeSetter> oVideoManager;
oVideoManager.setVideoMode();
InputHandlerManager<GLFWInputHandler> oInputHandlerManager;
oInputHandlerManager.handleKeys();
return 0;
}
现在我正在寻找一种解决方案来扩展上述代码,而不会失去基于策略的灵活性, 以便 GLFWInputHandler 和 GLFWVideoModeSetter 以某种方式连接,使 GLFWInputHandler 能够 获取glfwWindow。我的第一个解决方案是,将 GLFWInputHandler 模板化,然后专门化 InputHandlerManager,但感觉不正确 这样。您将如何处理这种依赖关系?
struct glfWindow {};
struct GLFWVideoModeSetter
{
void setVideoMode() {}
glfWindow *getGLFWWindow() { return new glfWindow(); }; //GLFWInputHandler depends on this -> glfWindow
};
template <class VideoModeSettingPolicy>
struct VideoModeManager : public VideoModeSettingPolicy {};
template <class T_GLFW_WINDOW_GETTER>
struct GLFWInputHandler
{
GLFWInputHandler(T_GLFW_WINDOW_GETTER &refWindowGetter) : ptrWindowGetter(&refWindowGetter) {}
bool handleKeys() { return true; }
private:
T_GLFW_WINDOW_GETTER *ptrWindowGetter;
};
template <class InputHandlerPolicy>
struct InputHandlerManager : public InputHandlerPolicy {};
template <>
struct InputHandlerManager<GLFWInputHandler<VideoModeManager<GLFWVideoModeSetter>>> : public GLFWInputHandler<VideoModeManager<GLFWVideoModeSetter>>
{
InputHandlerManager(VideoModeManager<GLFWVideoModeSetter> &refWGType) : GLFWInputHandler<VideoModeManager<GLFWVideoModeSetter>>(refWGType) {}
};
int main()
{
VideoModeManager<GLFWVideoModeSetter> oVideoManager;
oVideoManager.setVideoMode();
InputHandlerManager<GLFWInputHandler<VideoModeManager<GLFWVideoModeSetter>>> oInputHandlerManager(oVideoManager);
oInputHandlerManager.handleKeys();
return 0;
}
【问题讨论】:
标签: c++ templates dependencies policy