C++ C++;MVC模型到viewmodel“;翻译“;继承

C++ C++;MVC模型到viewmodel“;翻译“;继承,c++,model-view-controller,inheritance,C++,Model View Controller,Inheritance,在我的游戏项目中,我使用MVC模式。模型和视图完全分离。视图由观察者模式驱动。所以,当游戏实体(创建、销毁、更新等)上发生某些事情时,视图将通过侦听器得到通知。分配模型中的新实体后,我需要创建适当的viewmodel(EntityMesh) EntityMesh是viewmodel的基础 实体是模型的基础 对于此示例,模型派生树如下所示: 游戏::实体->游戏::物理实体->游戏::物理网格实体 游戏::实体->游戏::活动->游戏::自由活动 这就是我目前“解决”这个问题的方式……但在

在我的游戏项目中,我使用MVC模式。模型和视图完全分离。视图由观察者模式驱动。所以,当游戏实体(创建、销毁、更新等)上发生某些事情时,视图将通过侦听器得到通知。分配模型中的新实体后,我需要创建适当的viewmodel(EntityMesh)

  • EntityMesh是viewmodel的基础
  • 实体是模型的基础
对于此示例,模型派生树如下所示:

  • 游戏::实体->游戏::物理实体->游戏::物理网格实体
  • 游戏::实体->游戏::活动->游戏::自由活动
这就是我目前“解决”这个问题的方式……但在未来,我希望游戏的30+衍生物::实体和实体网格。这是非常丑陋的非面向对象设计

EntityMesh* WorldView::_translate(Game::Entity* const ent)
{  
    //TODO: finish translator...
    std::cout << "TRANSLATING!: " << typeid(ent).name() << std::endl;

    Game::PhysicalGridEntity* pgent = dynamic_cast<Game::PhysicalGridEntity*>(ent);
    if(pgent)
    {
        std::cout << "CREATING: PhysicalGridEntity" << std::endl;
        return new PhysicalGridEntityMesh(this, pgent);
    }
    else
    {
        Game::PhysicalEntity* pent = dynamic_cast<Game::PhysicalEntity*>(ent);
        if(pent)
        {
            std::cout << "CREATING: PhysicalEntity" << std::endl;
            return new PhysicalEntityMesh(this, pent);
        }
        else
        {
            Game::FreeActorEntity* faent = dynamic_cast<Game::FreeActorEntity*>(ent);
            if(faent)
            {
                std::cout << "CREATING: FreeActorEntity" << std::endl;
                return new FreeActorEntityMesh(this, faent);
            }
        }
    }

    return NULL;
};
EntityMesh*世界观::_翻译(游戏::实体*常量)
{  
//TODO:完成翻译。。。

std::cout首先,您没有控制器组件。连接模型和视图的业务逻辑在哪里?其次,我不确定您试图对所有这些ifs做什么,但工厂/访问者模式可能会帮助您。

使用访问者模式如何?我没有提到控制器,因为它没有任何作用关于这个问题。这些ifs只是我目前处理这个问题的一个例子。工厂/访客模式这可能会起作用…我在这里第二个黑猫,工厂/访客似乎是合适的。