C ++ MVC模型以viewmodel“翻译”和继承

时间:2012-02-20 14:05:46

标签: c++ model-view-controller inheritance

在我的游戏项目中,我正在使用MVC方案。模型和视图完全分开。视图由观察者模式驱动。因此,当游戏实体上发生某些事情(创建,销毁,更新......)时,将通过监听器通知视图。当分配模型中的新实体时,我需要创建正确的viewmodel(EntityMesh)。

  • EntityMesh是viewmodel的基础
  • Game :: Entity是模型的基础

对于此示例,模型派生树如下所示:

  • 游戏::实体 - >游戏:: PhysicalEntity - >游戏:: PhysicalGridEntity
  • 游戏::实体 - > Game :: ActorEntity - >游戏:: FreeActorEntity

这就是我目前“解决”这个问题的方法......但是在未来我期待Game + Entity和EntityMesh的30多个衍生物。这是非常丑陋和非OOP设计。

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;
};

任何想法如何在不混合View和Model的情况下使这个更清晰,更多OOP?

编辑:任何暗示使用哪种模式都会有所帮助:)

1 个答案:

答案 0 :(得分:2)

首先,您没有控制器组件。连接模型和视图的业务逻辑在哪里?其次,我不确定你要对所有这些ifs做什么,但也许工厂/访客模式会对你有所帮助。