2010-11-07 63 views
3

我将每个MVP三元组视为一个孤立的组件。例如,View实现了一个IView接口,当然,Presenter只知道View到IView。被动视图模式:组件之间的通信

我可以使组件尽可能重用。 现在我必须结合这些MVP组件来组成一个应用程序。我想知道好的做法是保持这些组件尽可能分离。但我当然需要让他们相互沟通/作出反应。

我可以让IView暴露给对方的演示者吗?或者我应该让演示者在不知道底层视图的情况下相互沟通?

谢谢

回答

3

在MVP中,我将主持人视为活动的编排者。因此,它们是构建应用程序基础的自然选择。

向其他演示者展示演示者的视图打破了MVP模式内封装的想法。虽然它不会降低暴露其视图的组件的可重用性,但它会降低使用另一个组件视图的组件的可重用性,因为它会增加组件依赖性。

所以我会保持对演讲者隐私的意见,只让演示者互相沟通。


回应置评

当我说保持视图私有的主持人,我的意思是私人:不暴露在外界,除非通过主持人的调解。当然,主持人可以将方法暴露给外部世界,这会导致它操纵其观点。如果主持人通过一个接口来实现这一点,那么它可能实际上使用它自己的视图作为接口实现的委托,但是与提议中的相反,主持人将视角委托给视图而不是相反。

这样做确保或至少使所有交互逻辑保留在演示者中的可能性更大,并且不会在演示者和视图中乱丢垃圾。

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

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

+0

你能详细解释一下吗?我假设你的意思是通过界面暴露演示者。该接口应该只包含与外部与视图交互相关的方法/事件。有了这个功能,我可以将由View实现的IView界面分成两部分:一部分是演示者专用,另一部分是演示者暴露在外。现在,演示者可以实现相同的公共接口并成为其视图的代表。或者它可以通过分割界面返回View。 – user129148 2010-11-07 17:46:47

+0

这很有道理!谢谢 – user129148 2010-11-07 23:44:38

0

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

一个good example是GWT MVP架构 和the newer version