使用 RX 通过调解器在两个组件之间进行通信



C1 和 C2 是彼此不了解的组件。C1 做 C2 关心的事情。我使用"经理/调解员"来允许他们之间的沟通。

C1 和 C2 都引用此调解器。C1 调用方法 mMediator.notifyItemProduced() Mediator并将"onItemProduction"事件转发给它拥有的任何侦听器。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 发布到 C2 订阅的Subject

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 和 C2 彼此不了解
  • 只有 C1 可以发布事件
  • 任何人都可以订阅这些活动

还是我有一个合理/最好的解决方案?

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

  • 抽象通信(消息发布者不需要知道它是如何完成的
  • 对发布的内容进行一些控制
  • 不要把Subject交给坏人

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

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

(请原谅我的 C# :)

相关内容

  • 没有找到相关文章

最新更新