【问题标题】:MVC - Model-View communicationMVC - 模型-视图通信
【发布时间】:2020-04-28 18:59:25
【问题描述】:

首先我想说的是,我搜索了很多,但是我在互联网上发现了很多相互矛盾的不同解决方案。

为了简化我的问题,我将使用一个示例。假设我想使用 MVC 设计模式为 2D 游戏生成地图:

MapView.java

public class MapView extends TheViewComponent {
    public MapView() {
        // Create the view
    }
}

MapController.java

public class MapController {
    // …

    public MapController(Map map, MapView mapView) {
        this.map = map;
        this.mapView = mapView;
    }
}

Map.java

public class Map {
    public void generate() {
        // Should create tiles in my MapView.
    }
}

Main.java

public class Main {
    public Main() {
        Map map = new Map();
        MapView mapView = new MapView();
        MapController mapController = new MapController(map, mapView);
    }
}

generate() 方法(Map.java)中,我不明白如何更新视图。在我的 Map 类中,我没有对控制器或视图的引用。

  • 我应该使用new Map(mapView) 将视图传递给模型吗? (看起来很奇怪……)
  • 我应该在控制器中生成地图吗?但如果这是真的,那么假设我的Map.java 中有一个图块列表,并且假设我在 Tile 和 TileView (如我的地图)上有操作要做。我想存储ArrayList<Tile> 而不是ArrayList<TileController>...所以第二个解决方案似乎也很奇怪...

【问题讨论】:

    标签: java model-view-controller


    【解决方案1】:

    域模型Map 应该只保存地图的结构,并且应该让外部世界可以访问它(例如getTiles())。然后,视图应该使用该域数据来相应地渲染地图。

    对于操作,控制器应为相关操作提供入口点,并将它们分派到服务层,该服务层反过来会更新域模型。

    【讨论】:

    • 我应该把map.generate()mapView.update() 放在Controller 还是Main 中?
    • 我不确定Main 在您的上下文中的用途是什么。在我看来,Main 应该只启动应用程序。控制器为外部世界提供 API 以与您的应用程序交互(例如,视图可以提供一个按钮,然后调用此类操作,或者 REST API 调用可以触发此类控制器操作。)控制器主要负责处理此类请求。这可能涉及数据操作,但通常您需要一个用于对数据进行实际操作的服务层和一个用于存储/检索数据的数据层。
    • 所以map.generate() 应该是服务层或控制器内部的一部分。 mapView.update() 应该从控制器调用。实际上,我认为generate() 不应该是模型本身的一部分,而应该是创建地图的服务功能。 Map 应该只保存数据本身。
    【解决方案2】:

    MVC 是一种旨在分离职责的架构模式

    型号
    这是您的业务层(域和逻辑),不应该对您将如何“查看”数据有任何发言权。例如,模型为您提供了一个对象/列表/地图,其中包含要显示的信息。

    提示:此处您的代码不应依赖 Web 框架或 HTTP Servlet API

    查看
    这是负责在用户界面中呈现数据的层:它不应包含业务规则或安全性,而应仅包含表示逻辑

    控制器
    它位于中间:它将请求分派给相关的模型并将结果转发给适当的视图

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2011-09-06
      • 2011-06-10
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      相关资源
      最近更新 更多