代码之家  ›  专栏  ›  技术社区  ›  stakx - no longer contributing Saravana Kumar

我是否正确地实现了MVP/表示模型UI模式?

  •  2
  • stakx - no longer contributing Saravana Kumar  · 技术社区  · 15 年前

    我正在使用WinForms应用程序,希望使用 Presentation Model pattern 对于UI。如果我做得正确,有人能告诉我下面的解释吗?


    我决定建立如下的依赖关系:

       Model <---- Presentation Model <---- View
    

    即:

    • 模型只知道它自己。

    • 表示模型引用了模型(但反之亦然)。

    • 视图引用了表示模型(但反之亦然)。

    我使用WinForms数据绑定来保持视图和演示模型的同步。

    现在,这一切都像一个魅力,除了当我需要处理的时候,例如点击一个表单的“关闭”按钮。由于表示模型没有对视图的引用,因此它不能订阅视图发布的任何事件。因此,我想出了以下拐杖:

    Presentation Model                   View
    +--+                                 +--+
    |  |                                 |  |
    |  |                                 | <--------X closeButton.Click event fires
    |  |                                 |  |
    |  |                         +--------X |
    |  |   CloseRequested = true |       |  | 
    |  |                         +--------> |
    |  |                                 |  |
    |  | CloseRequested   CloseRequested |  |
    | <-----------------------------------< |
    |  |                                 |  |
    | X--------+                         |  |
    |  |       | IsClosed = true         |  |
    | <--------+                         |  |
    |  |                                 |  |
    |  | IsClosed              MustClose |  |
    | >-----------------------------------> |
    |  |                                 |  |
    |  |                                 | X--------> view.Close()
    |  |                                 |  |
    +--+                                 +--+
    

    即:

    • 用户单击“关闭”按钮。

    • 纽扣的 Click 在视图中捕获事件,该事件通过设置属性进行响应 CloseRequested .

    • 数据绑定将此值传输到表示模型中的相应属性。

    • 表示模型通过设置其属性来响应此更改。 IsClosed .

    • 数据绑定将此值传输到视图的 MustClose .

    • 视图通过关闭自身来响应此更改。

    然而,表示模型与视图完全分离,反之亦然。 只处理一个按钮命令需要做很多工作 . 考虑到我决定的依赖关系图,有没有更简单的方法?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Rich    15 年前

    我最近一直在将Windows窗体应用程序转换为MVP体系结构,看起来您的依赖项设置方式与我所做的类似。不过,我只是有一个 IPresenter 定义允许视图传递用户请求的方法的接口。由于视图已经依赖于演示者和对其的引用,因此直接对其调用请求方法似乎是明智的。

    所以在我的系统中,演示者监听模型中的事件,并为任何感兴趣的视图触发自己的表示事件。视图通过适当地更新自身来响应这些事件,并在发出用户请求时将其转发给演示者。

        2
  •  1
  •   ktutnik    15 年前

    这只是我的意见。

    使用表示模型需要100%的用户界面支持数据绑定。即使是wpf也不会使close操作成为可绑定的。在诸如MessageBox确认之类的表示模型中,很多事情都无法顺利工作。即使它可以通过演示者界面抽象出来,但仍然不好吃,而且牺牲了简单性。

    另一方面,表示模型的主要目的是测试视图逻辑。在某些情况下,如果您的“关闭操作”应该进行单元测试,因为在关闭之前有一些逻辑,那么您的代码是唯一的选择。但如果这只是一个简单的确认“你确定要退出吗”,那么你最好把它放在视图上而不是表示模型中,因为它不需要单元测试。

        3
  •  0
  •   Graham Clark    15 年前

    视图引用了 演示模型(但不是副模型) 反之亦然)。

    afaik演示文稿应该有一个引用来更精确地查看界面iView,这样演示文稿就不会与具体视图耦合。然后在表示类中,您可以调用视图方法并通过iView订阅视图事件。

    推荐文章