【问题标题】:Passive View Pattern: Communication Among Components被动视图模式:组件之间的通信
【发布时间】:2011-05-06 05:00:02
【问题描述】:

我将每个 MVP 三元组视为一个独立的组件。以 View 实现 IView 接口为例,Presenter 当然只能通过 IView 知道 View。

我可以使组件尽可能地可重用。 现在我必须组合这些 MVP 组件来形成一个应用程序。我想知道将这些组件尽可能分开的好做法是什么。但我当然需要让他们相互交流/做出反应。

我可以让 IView 暴露给其他的 Presenter 吗?还是应该让演示者在不了解底层视图的情况下相互交流?

谢谢

【问题讨论】:

    标签: design-patterns mvp


    【解决方案1】:

    在 MVP 中,我将演示者视为活动的协调者。因此,它们是构成应用程序的自然选择。

    将演示者的视图暴露给其他演示者会破坏 MVP 模式中的封装理念。虽然它不会降低暴露其视图的组件的可重用性,但它确实会降低组件利用另一个组件的视图的可重用性,因为它会增加组件的依赖关系。

    所以我会将视图对演示者保密,只让演示者相互交流。


    详细说明回应评论

    当我说对演示者保持私有视图时,我的意思是私有:除非通过演示者的调解,否则不会暴露给外部世界。当然,演示者可以向外部世界公开方法,这将导致它操纵其视图。如果演示者通过接口执行此操作,它实际上可能使用自己的视图作为接口实现的委托,但是 - 与您的提议相反 - 演示者将内容委托给视图,而不是相反。

    这样做可以确保,或者至少使所有交互逻辑更有可能保留在演示者中,并且不会在演示者和视图中散布。

    视图只能由其演示者操作。现在当然可以在多个演示者中重用视图,但是视图的实例只能由实例化它的演示者操作。如果您直接公开它(甚至通过整个或部分接口),您开始不得不处理可以由多个演示者操作的视图,并且不再有单个演示者控制该视图。

    我在视图中拥有的唯一代码是向其演示者通知用户所做的事情(在某些 MVP 讨论中也称为用户手势)。由演示者决定如何处理它。我还保留了有关启用/禁用哪些控件以响应演示者中而不是视图中的用户选择的所有逻辑。这不仅将所有交互逻辑保留在演示者中,还有助于创建可单元测试的用户界面(表单)。

    【讨论】:

    • 您能详细说明一下吗?我假设您的意思是通过界面暴露演示者。这个接口应该只包含与视图的外部交互相关的方法/事件。这样我就可以把View实现的IView接口拆分成两部分:一个是它的presenter私有使用,另一个是presenter对外暴露。现在,Presenter 可以实现相同的公共接口并成为其 View 的委托。或者它可以通过该拆分界面返回视图。
    • 这很有意义!谢谢
    【解决方案2】:

    编排演示者的一个好习惯是使用事件总线。 演示者注册到总线并收听他们需要做出反应的事件。 其他演示者在公共汽车上抛出事件,让可能的目标知道,什么 他们刚刚做到了。 消息应该基于问题域,而不是技术 (例如“产品 123 已创建”)

    good example 是 gwt mvp 架构 和the newer version

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2015-02-11
      • 1970-01-01
      • 2011-03-01
      • 2013-02-17
      • 2011-11-21
      • 2011-09-06
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多