Работа с традиционной моделью обратного вызова слушателя. У меня есть несколько слушателей, которые собирают разные вещи. Собранные вещи каждого слушателя находятся внутри слушателя во внутренних структурах.
Проблема в том, что я хочу, чтобы некоторые слушатели знали о некоторых «вещах» в других слушателях.
Я применяю порядок регистрации слушателя, поэтому, если я сознательно регистрирую события в каком-то порядке, более поздний слушатель может быть уверен, что ранее прослушиватель обновил свой материал и каким-то образом получил к нему доступ, чтобы сделать больше материала.
Моя первая попытка сделать так, чтобы каждый слушатель сохранял ссылку на слушателей, от которых он зависит. Поэтому я регистрирую прослушиватели в порядке тех, у кого нет зависимостей, и тех, у кого были предварительно зарегистрированные зависимости, а затем устанавливаю ссылки между слушателями различными способами.
Я начинаю понимать, как это плохо, и мне было интересно, как-то проделывал этот путь раньше. Что может быть более подходящим шаблоном, когда одному из слушателей нужен доступ к материалу другого?
Вот некоторый псевдокод для иллюстрации:
interface Listener { onEvent(char e); }
class A implements Listener {
private int count;
public void onEvent(char e) { if(e == 'a') count++; }
public int getCount() { return count; }
}
class B implements Listener {
private int count;
// private A a;
// private void setA(A a) { this.a = a; }
public void onEvent(char e) { if(e == 'b') count++; }
public int getCount() { return count; }
public int getAPlusBCount() {
// We know B count, but we don't know A so how would we change this
// so B is A aware? Or not even aware, just somehow coupled? This
// is the question
// return a.getCount() + count;
}
public void doConditionalHere() {
// Do some condition in B that relies on the state of data in A
int acount = 0; // a.getCount(); ???
if(acount % 2 == 0) {
this.count--;
}
}
}
class Run {
A a = new A();
B b = new B();
List listeners = new List();
listeners.add(a);
listeners.add(b);
// The ugly way I add coupling right now is to keep a reference to A
// inside B. It's commented out because I am hoping there is a more intelligent approach
// b.setA(a);
for(char c : "ababbabab") {
for(listener : listeners) {
listener.onEvent(c);
}
}
}