【问题标题】:Using RX to communicate between two components through a mediator使用 RX 通过调解器在两个组件之间进行通信
【发布时间】:2016-01-21 05:05:53
【问题描述】:

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 发布和 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 是一个发出数据请求和存储状态的对象。组件是视图。它目前不管理谁可以生产或消费,因为它允许任何人通知项目已经生产,并允许任何人将自己添加为侦听器。
  • 然后我建议中介有一个IDisposable Publish(IObservable source) 方法和一个IDisposable Subscribe(IObserver destination) 方法。这样,调解员就可以跟踪传入和传出的值,并且可以管理错误。否则你最好不要有一个持久的中介,而只是将可观察对象直接连接到观察者。

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


【解决方案1】:

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

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

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

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

(请原谅我的 C# :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多