【问题标题】:Mutual update between two classes of same superclass同一超类的两个类之间的相互更新
【发布时间】: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


【解决方案1】:

查看者之间共享的信息不是在Viewer 即基类中可见吗?如果是这样,那么一个抽象 Viewer 需要知道如何从另一个抽象 Viewer 进行更新,但没有必要让每个具体的 Viewer(例如 PatternViewerMeshViewer)知道另一个具体的 Viewer - 在换句话说,不需要循环依赖。

【讨论】:

    【解决方案2】:

    这种情况的标准模式是 MVC(模型、视图、控制器)。

    使用这种模式,任何观看者都不知道对方。视图之间共享的数据在模型中。当查看器需要更新某些内容时,它会更新模型(尽管如果您真的遵循 MVC,视图应该只显示输出,而输入应该来自控制器)。

    与原始数据一起,模型会保留一份包含所有当前数据视图的列表。当模型更新时,它会将更改传播到所有视图。

    请注意,MVC 有许多变体。一些消除了“控制器”部分,以支持更接近您正在做的事情:视图同时进行输入和输出(但仍将公共数据移动到模型中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多