您如何设计代码,以使您拥有几个主题的观察者模式并想知道发生了什么?
明显的解决方案是
interface SubjectOneObserver {
void update(SomeStateModel m);
}
interface SubjectTwoObserver {
void update(SomeStateModelTwo m2);
}
然后一些混凝土
class Concrete implements SubjectOneObserver, SubjectTwoObserver {...}
不是很好,将创建许多接口。最好的方法是什么?
我将使用现有的接口或通用接口作为匿名类(或更好的lambda(,而不是创建许多接口并直接在类中实现它们。
java(8 (已经为您的用户酶提供了一个名为消费者的接口:https://docs.oracle.com/javase/8/docs/api/java/java/java/util/function/function/consumer.html
class Observable {
// there are better ways than using a list, but it shows how the subject would work
private List<Consumer<SomeStateModel>> subjectOne = new ArrayList();
private List<Consumer<SubjectTwoObserver>> subjectTwo = new ArrayList();
subscribeOne(Consumer<SomeStateModel> observer) {
subjectOne.add(observer);
}
subscribeTwo(Consumer<SubjectTwoObserver> observer) {
subjectTwo.add(observer);
}
triggerOne(SomeStateModelTwo state) {
subjectOne.forEach(c -> c.accept(state));
}
....
}
class Concrete {
Concrete(Observable instanceToObserve) { // i put that in the constructor, no idea were you get your instance from
instanceToObserve.subscribeOne(state -> {
// this will get called when subjectOne is triggered
})
instanceToObserve.subscribeTwo(state -> {
// this will get called when subjectTwo is triggered
})
}
}
您的问题非常广泛,目前尚不清楚您实际要实现的目标。特别是您如何将观察者订阅为主题。如果您使用大量可观察到的主题,那么也许您应该使用已经具有所有功能的库,例如rxjava:https://github.com/reactivex/rxjava