被动视图模式:组件间的通信

时间:2010-11-07 03:34:51

标签: design-patterns mvp

我将每个MVP三元组视为一个孤立的组件。例如,View实现了一个IView接口,Presenter当然只知道View到IView。

我可以使组件尽可能重用。 现在我必须将这些MVP组件组合起来形成一个应用程序。我想知道将这些组件尽可能分开是一种好的做法。但当然我需要让他们彼此沟通/反应。

我可以让IView暴露给其他人的演示者吗?或者我应该让演示者在不知道基础视图的情况下相互交流?

由于

2 个答案:

答案 0 :(得分:3)

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

将演示者的视图暴露给其他演示者打破了MVP模式中封装的想法。虽然它不会降低组件暴露其视图的可重用性,但它确实会降低组件的可重用性,因为它会增加组件的依赖性。

因此,我会将视图保密于演示者,只让演示者互相沟通。


详细说明以回应评论

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

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

视图只能由其演示者操纵。当然,您可以在多个演示者中重复使用视图,但视图实例只能由实例化它的演示者操作。如果直接公开它(甚至通过整个或部分接口),你就开始处理一个可以被多个演示者操纵的视图,而且没有一个演示者可以控制视图了。

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

答案 1 :(得分:0)

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

good example是gwt mvp架构 和the newer version