使用传统的侦听器回调模型。我有几个收集各种东西的听众。每个听众收集的东西都在内部结构中的听众内部。
问题是我希望一些听众知道其他听众的一些“东西”。
我强制执行侦听器注册顺序,因此如果我故意以某种顺序注册事件,稍后的侦听器可以确保先前的侦听器更新了它的内容并以某种方式访问它以执行更多操作。
我对此的第一次尝试是让每个侦听器存储对它所依赖的侦听器的引用。所以我按照没有依赖的顺序注册监听到有之前注册依赖的监听,然后在各种方法中设置监听之间的引用。
我开始意识到这种感觉有多糟糕,我想知道以前是否曾以某种方式走过这条路。当一个听众需要访问另一个听众的东西时,什么是更合适的模式?
这里有一些伪代码来说明:
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);
}
}
}