使用RX通过介体在两个组件之间进行通信

时间:2016-01-20 19:26:50

标签: design-patterns system.reactive rx-java

C1和C2是彼此不了解的组件。 C1做C2关心的事情。我使用“管理器/调解器”来允许它们之间的通信。

C1和C2都引用了这个中介。 C1调用方法mMediator.notifyItemProduced()Mediator将'onItemProduced'事件转发给它拥有的任何侦听器。 C2实现了这个监听器接口,并用它做了它想要的东西。

class Mediator {
   List<Listener> mListeners;

   public void notifyItemProduced() {
        for each listener in mListeners
            listener.onItemProduced();
   }

   public void addListener(Listener listener) { ... }

   public interface Listener { 
       void onItemProduced();
   }
}

class C1 {
    public void onClick() { mMediator.notifyItemProduced(); }
}

class C2 {
    public C2 { mMediator.addListener(this); }

    public void onItemProduced() { 
        // do something here!
    }
}

我正在评估用RX实现替换这个模式。我认为Mediator应该保留C1发布到Subject并且C2订阅。

class Mediator {
   Subject<Boolean, Boolean> mItems;

   public Subject<Boolean, Boolean> getItemsSubject() {
        return mItems;
   }

   public Observable<Booelan> getItemsStream() {
       return mItems.asObservable();
   }
}

class C1 {
    public void onClick() { mMediator.getItemsSubject().onNext(true); }
}

class C2 {
    public C2 { mMediator.getItems().subscribe(b => doSomething(b)); }
}

我不喜欢Mediator向所有人公开发布事件的能力。虽然我知道这种能力存在于基于监听器的实现中,但我想知道是否存在允许的模式:

  • C1&amp; C2彼此不了解
  • 只有C1才能发布活动
  • 任何人都可以订阅这些活动

或者我有合理/最佳解决方案?

1 个答案:

答案 0 :(得分:2)

要改善您当前的解决方案,我会将Mediator.getItemsSubject()替换为Mediator.publishValue( T value )以便

  • 摘要通信(消息发布者不需要知道它是如何完成的
  • 获得对已发布内容的控制权
  • 不要将Subject交给错误的人

如果您真的需要,只允许C1发布消息:在事件中发出C1信号,Mediator可以注册C1 }对象作为发布者并根据Observable事件发出C1值,例如Observable.FromEventPattern。现在,您的界面可能如下所示。

interface Mediator {
    void AddPublisher(C1 pub);
    void RemovePublisher(C1 pub);
    Observable<bool> GetItemsStream();
}

(原谅我的C#:)