【问题标题】:MVP Pattern: should multiple Presenters be decoupled or can they communicate directly?MVP 模式:多个 Presenter 应该解耦还是可以直接通信?
【发布时间】:2009-02-23 04:29:52
【问题描述】:

我有一个如下所示的用户界面:

    +--------+---------------+
    | model1 | model details |
    | model2 |     here,     |
    | model3 | loaded as the |
    |        | user selects  |
    |        | a model from  |
    |        |   the left.   |
    |        |               |
    +--------+---------------+

我正在使用MVP pattern 来驱动这个用户界面。

我在这里简化了很多,但为了分而治之,我想将 Presenter 一分为二:一个在左侧的 View 中处理用户手势(用户更改此 View 中的 Model 列表,例如排序)和另一个在右侧视图中处理用户手势的 Presenter(用户更改此视图中的单个模型)。

虽然左侧的 Presenter 与整个模型列表交互,但右侧的 Presenter 仅与单个模型交互:用户从左侧列表中选择的模型。 IOW ui 是从左到右驱动的。

用户选择(即点击)左侧的模型后,我当前的实现(大致)如下所示:

LeftPresenter.onModelClick = function(event) {
    var model = this.getModelFromEvent(event);
    this.view.setSelectedModel(model); // updates list widget on left
    RightPresenter.setSelectedModel(model); // notify the other Presenter
}

RightPresenter.setSelectedModel = function(model) {
    // lazy load the model from the db, and update the
    // view when the model fires the "loadComplete" event
    model.bind('loadComplete', this.view.setModel);
    model.lazyLoad();
}

这是我对 MVP 模式或任何 MVC GUI 模式的模糊部分:

  1. 一个 ui 可以像这样由多个 Presenter 驱动吗?
  2. 应该将多个 Presenter 解耦还是可以直接相互通信,如此处所示?

所以我的问题归结为:RightPresenter 表明用户在LeftPresenter 的视图中选择了一个模型的最佳方式是什么

【问题讨论】:

    标签: model-view-controller mvvm mvp


    【解决方案1】:

    1.一个ui可以由多个驱动吗 这样的主播?

    是的

    2.是否应该有多个 Presenter 解耦或者他们可以交流 直接相互如图 在这里?

    我的处理方式是我有一个看起来像这样的框架

    当事件发生时,UI_Object 会处理创建和触发 Command 对象的事件。每个 UI_Object 都实现了一个在 UI_Views 中找到的视图接口,并将自己注册到 UI_View。命令对象可以通过接口访问在 UI_View 中注册的 UI 对象。

    例如,在我的一个金属切割应用程序中,有一个称为 HOLD 的屏幕元素,其中包含尚未放置在金属板上进行切割的所有部件。零件可以通过多种方式进入货舱。从零件文件中加载、由形状编辑器创建、由我们的 CAD 屏幕创建或从金属板上拾取。

    这些操作中的每一个都被封装到实现命令设计模式的单独命令对象中。当命令对象执行时它会调用。

    CuttingScreen.Refresh
    CADScreen.Refresh
    ShapeEditor.Refresh
    

    其中的每一个都会刷新相应的屏幕来更新保持。

    现在我可以向我的应用程序界面添加一个方法。 MyCuttingApplication.HoldRefresh 将依次调用所有三个刷新。

    但重要的一点是,你的视图调用了一个命令,该命令使用视图实现的接口进行更新。视图对象在低层注册自己。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多