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
向所有人公开发布事件的能力。虽然我知道这种能力存在于基于监听器的实现中,但我想知道是否存在允许的模式:
或者我有合理/最佳解决方案?
答案 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#:)