使用传统的侦听器回调模型。我有几个听众收集各种东西。每个侦听器收集的内容都在内部结构的侦听器中。正确耦合需要访问共享状态数据的多个侦听器
的问题是,我想一些听众要注意的一些在其他听众的“东西”。
我执行侦听器注册顺序,所以如果我明知注册以某种顺序事件后听众可以肯定的是先前听众更新了东西,并以某种方式访问它做更多的东西。
我在第一次尝试让每个听者存储其所依赖听众的参考。因此,我按照没有依赖关系的顺序将侦听器注册到那些具有预先注册依赖关系的侦听器中,然后用各种方法在侦听器之间设置引用。
我开始意识到多么糟糕这感觉,我想知道,如果不知何故以前一直沿着这条道路。当其中一位听众需要访问另一位听众时,什么会是更合适的模式?
下面是一些伪代码来说明:
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);
}
}
}
“我要继续前进,并接受你的答案,因为它的工作原理,但我希望为一些其他的方式。”这很愚蠢。为什么接受它?为什么不等待更好的答案? – 2008-11-10 02:53:56
好的,我会等的。 – Josh 2008-11-10 14:36:06