【问题标题】:MVP vs. Event driven in android applicationsMVP 与 android 应用程序中的事件驱动
【发布时间】:2016-10-14 09:47:00
【问题描述】:

我假设您熟悉 MVP 和事件驱动模式。
据我所知,MVP 和事件驱动模式都旨在负责任地分离并提高可读性。但是使用像事件总线这样的库可以更容易地实现事件驱动。

我的问题是,如果您可以使用事件和订阅者模式分离方法职责,那么将应用程序架构更改为 MVP 有什么好处?

我的问题的第二部分是使用事件库(如 Eventbus)和 MVP 模式的可行性。

【问题讨论】:

    标签: java android design-patterns architecture


    【解决方案1】:

    事件驱动架构用于通信。您可以使用它在应用程序中松散耦合的组件之间传输消息/事件。 好处:您摆脱了添加/删除组件的麻烦,即在不修改发布者的情况下删除订阅者等等。

    MVP 用于构建应用程序逻辑。它可以帮助您使业务逻辑远离 GUI,并引入 Presenter 作为处理 View 事件的中间人,涉及适当的 Model 来处理与每个 View 事件对应的业务逻辑,并将数据格式化到 View。 好处:它划定了 UI 逻辑和业务逻辑之间的界限,允许您在没有任何具体 UI 内容的情况下测试业务逻辑甚至两种逻辑。

    现在是第一部分:由于最关心的是如何编写应用程序逻辑以及如何确保逻辑在应用程序中很好地实现(单元测试),MV* 可以帮助您,而不是 EventBus。

    第二部分:是的,您可以将 EventBus/MessageBus 与 MVP 一起使用,因为它们负责不同的事情。例如,您使用 MVP 将 Fragment 构建为 View、Presenter 和 Model,并使用 EventBus/MessageBus 来实现您的 Fragment 与您应用中的其他 Activity、Fragment 之间的通信。

    提供 MessageBus 和 MVP 的实际框架在这里:http://robo-creative.github.io/mvp。如果您想了解如何将它们结合起来,请阅读以下指南:http://robo-creative.github.io/mvp/presenter-features.html

    【讨论】:

    • 好的,你建议在 android 应用程序中使用 MVP 或 MVC?因为组件之间是松散耦合的。 Activity 可以充当控制器,同时可以充当视图(例如提供过渡动画等。)
    • MVP 是首选。 Activity 不应充当 Presenter 或 Controller。是的,它可能是一个视图。
    【解决方案2】:

    编辑:清理并缩短它。

    我认为事件驱动架构和 MVC 架构的好处并不像您的问题所暗示的那样相互排斥。您可以设计既是事件驱动又与 MVC 架构一致的代码。

    事件驱动意味着您拥有在某些事件发生时执行的事件处理程序。事件从低级别开始(鼠标动作和键盘动作)并通过工具包向上渗透到更高级别的处理程序。 MVC 关注您如何组织处理程序的位置以及它们如何与业务逻辑交互。

    所以回到 EventBus。如果您通过 EventBus 指向所有 UI 事件,并且对模型的所有更改又通过 Eventbus 传递回视图,那么我会说 EventBus 库构成了 MVC 架构中控制器的重要部分。

    当我想到 MVC 时,我的目标是将业务逻辑和数据与数据表示分离。像 Eventbus 这样的东西可以帮助你做到这一点。您的控制器类将把您的模型绑定到 EventBus,并将 UI 插入另一侧。当你完成后,你的模型只知道它被赋予了一个事件流。它不知道事件流是由 GUI、测试设备还是硬件调试器提供的。

    【讨论】:

    • 我在我的应用程序中使用事件驱动代码已经有一段时间了。并且真的同意你的观点,事件驱动的代码就像一个 MVC 模式,一个视图不知道答案来自哪里,它只是触发一个事件。但我的问题是在您的第二个断言中,事件驱动架构可以用 MVC 模式替换。你认为如果使用事件总线(例如),那么我不需要在我的应用程序中使用 MVP 模式?
    • 我并不是说事件驱动取代了 MVC。它可以与MVC结合使用。也许我误解了您所说的事件驱动的意思。对我来说,这意味着,低级事件(计时器溢出或用户单击按钮)会渗透到更高层,包括业务逻辑。高级代码无法预测/控制操作顺序。实际上,某些操作可能会在不同的线程中同时执行。相反的是某种轮询循环。在那里,计时器和按钮状态被反复检查,直到发生某些事情,然后循环调用处理程序。
    • 我只是在和某人讨论这件事,他的事情我可能仍然误解你。您的意思是建议使用事件总线使您的程序“非事件驱动”吗?还是不是MVP?在任何非事件驱动的地方都很难找到 UI 工具包。而 EventBus 在向模型隐藏视图方面走了很长一段路(并非一直如此)。那么你认为你没有得到什么好处呢?为什么?
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2011-06-26
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多