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# :)