视图中的跨组件通信(MVC)

时间:2008-10-10 04:47:38

标签: model-view-controller design-patterns

有哪些最佳实践可以协调View中复杂组件之间的交互?

我不是在讨论像组合框或网格控件这样的简单小部件,而是由多个小部件组成的组件,这些组件可能需要自己进行单元测试。

你愿意:

  1. 为每个组件定义抽象接口,让Controller 通过依赖注入将它们连接起来,让它们通过方法调用直接相互通信? 因此,组件可以识别其他组件的接口。
  2. 定义每个组件可以触发的事件,并且让Controller 通过事件监听器直接将它们连接起来? 因此,组件将事件处理程序附加到其他组件的事件接收器。
  3. 为每个组件定义抽象接口,定义可以触发的事件,并让让Controller 监听所有事件并在接口上执行方法调用? 因此,组件与其他组件完全无关。
  4. 观察者模式的经典应用程序?
  5. 还有别的吗?
  6. 更新:我从#1-3中删除了“让控制器......”,因为在这些情况下,控制器不一定需要进行路由/编排。它可能是视图本身。

    我在最近的一个项目中采用了方法#3,我很满意组件的解耦和个体可测试性。但是,我觉得我可以简化组件的接线。在我的例子中,主View对象必须在每个组件上添加多个事件侦听器,然后在有时进行一些本地处理(比如与模型交谈)之后调用适当组件上的方法。添加事件处理程序的代码看起来有点混乱,我特别想找到一种干净的方法。

2 个答案:

答案 0 :(得分:4)

选项#3听起来像Mediator模式,并且当对象之间的更新逻辑和通信很复杂时,它通常是最好的方法。它还具有保持控制逻辑和初始化集中的附加优势,这使得跟踪和调试这些类型的案例更容易。

答案 1 :(得分:0)

听起来你有这方面的知识可以回答你自己的问题,但可能只是缺乏潜入的信心。你只是在探索还是被困在某个地方?

我想补充一点,你可以做的另一件事就是在所有对象之间放置一个组件管理器,以方便沟通。在过去,当我做了类似的事情时,管理对象最终只是从每个组件中获取数据,将数据合并在一起,并将其作为一个大请求传递给模型。我的每个组件都有一个他们会调用的委托,并且会将数据传入,当然该委托的实现也在我的组件管理器上。

我还让那个管理器对象充当网络的代理我等待复杂性提高到我加入SRP并将这个责任作为自己的类之前。

基本上你说的一切听起来都不错。我建议你潜入并探索。