观察者模式与事件总线消息方法

时间:2019-07-14 03:53:48

标签: java oop model-view-controller design-patterns architecture

我一直在仔细研究MVC实现和事件总线。

为什么不使用事件总线而不是观察者模式来实现MVC应用程序?

例如,假设我有两个类ModelView,在典型的观察者模式中为:

public class Model implements Subject { ... }

public class View implements Observer { ... }

相反,使用green robot event bus或任何其他事件总线的方法的好处/缺点是什么?

那会是这样的:

public class Model {
   private int field = 0; 

   void someFunctionNowTriggerStateChange() {
     this.field = field + 1;
     ...EventBus.getDefault().post(this); //pass itself as the event
   }
}

public class View {

  @Subscribe onModelUpdated(Model model) {
    updateTextLabel(model);
    //other model updates
  }   
}

使用EventBus实施MVC与典型的Observer有什么问题(如果有的话)?

1 个答案:

答案 0 :(得分:2)

EventBus实现发布者订阅者模式

  

EventBus是Android和Java的开源库,使用发布者/订阅者模式进行松散耦合。

difference from observer pattern是发布者与订阅者之间的松散耦合

  

发布者和订阅者不知道彼此之间是否存在。有第三个组件,称为代理或消息代理或事件总线,发布者和订阅者都知道它,它过滤所有传入消息并相应地分发它们。换句话说,pub-sub是一种模式,用于在不同的系统组件之间传递消息,而这些组件之间不了解彼此的身份。

优点之一是发布者/订阅者模式可以正常/轻松地以异步方式实现,因为拥有第三个组件(代理)有助于实现异步行为,因为执行变得松散耦合

另一个优点是,由于发布者/订阅者模式是松散耦合的,因此实现多个订阅者也将更加直观/容易

  

观察者模式主要以同步方式实现,即,当某个事件发生时,主题调用其所有观察者的适当方法。发布者/订阅者模式主要以异步方式(使用消息队列)实现。

如果您不需要(也不需要)这样的代理,则可以安全地使用观察者模式,这将使您的代码更小,更简单