【发布时间】:2015-10-12 17:13:56
【问题描述】:
我有一个 OpenGL 应用程序,它有两个主要部分(查看器),主循环如下:
int main(int argc, char* argv[])
{
gp::viewers::PatternViewer pViewer;
gp::viewers::MeshViewer mViewer;
while (!pViewer.shouldClose() && !mViewer.shouldClose())
{
pViewer.makeCurrent();
pViewer.mainLoop();
pViewer.swap();
mViewer.makeCurrent();
mViewer.mainLoop();
mViewer.swap();
glfwWaitEvents();
}
glfwTerminate();
return 0;
}
碰巧用户与一个查看器的交互应该将更改传播给另一个查看器。我的直觉告诉我更新循环如下:
int main(int argc, char* argv[])
{
gp::viewers::PatternViewer pViewer;
gp::viewers::MeshViewer mViewer;
while (!pViewer.shouldClose() && !mViewer.shouldClose())
{
pViewer.makeCurrent();
pViewer.mainLoop();
pViewer.swap();
mViewer.makeCurrent();
mViewer.mainLoop();
mViewer.swap();
// UPDATE HERE
mViewer.update(pViewer);
pViewer.update(mViewer);
glfwWaitEvents();
}
glfwTerminate();
return 0;
}
但在这种情况下,PatternViewer 需要了解 MeshViewer,而 MeshViewer 需要了解 PatternViewer——一种循环依赖。此外,还不清楚 mViewer.update(pViewer) 是否应该使用 mViewer 提供的任何更新来更新 pViewer,反之亦然。在我看来,它应该是前者 - mViewer 应该知道要传播哪些更新,而不是 pViewer。
需要说明的是,PatternViewer 和 MeshViewer 都继承自抽象超类 Viewer。
有没有办法解决这种循环依赖?是否有公认的方式/设计模式来处理这种情况?
【问题讨论】:
-
你不能做一个帮助类,它同时进行更新,当你需要更新时,你调用它的对象。在构造函数中,它需要一个指向其他两个对象的指针,并以一致的方式进行更新。
-
您可以尝试基于事件的方法:将用户交互放入一个事件中并将其发送给所有查看者,每个查看者都在过滤它感兴趣的事件。
标签: c++ design-patterns circular-dependency