【发布时间】: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