gpt4 book ai didi

java - 需要访问共享状态数据的多个监听器的正确耦合

转载 作者:行者123 更新时间:2023-12-01 19:26:41 26 4
gpt4 key购买 nike

使用传统的监听器回调模型。我有几个收集各种东西的听众。每个监听器收集的内容都位于监听器的内部结构中。

问题是我希望一些听众了解其他听众的一些“东西”。

我强制执行监听器注册顺序,因此,如果我故意按某种顺序注册事件,后面的监听器可以确保先前的监听器更新了其内容,并以某种方式访问​​它以执行更多操作。

我的第一次尝试是让每个监听器存储对其所依赖的监听器的引用。所以我按照没有依赖的监听器到有依赖的监听器的顺序注册监听器,然后通过各种方法设置监听器之间的引用。

我开始意识到这种感觉有多糟糕,我想知道以前是否也经历过这条路。当一个监听器需要访问另一个监听器中的内容时,什么是更合适的模式?

这里有一些伪代码来说明:

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);
}
}
}

最佳答案

您在这里描述了很多耦合。最好的办法是消除所有这些反向 channel 依赖性,但如果做不到这一点,您可能会让那些具有依赖性的人不在初始监听器列表上监听,而是在它们所依赖的任何内容上监听。或者您可以让他们等待,直到收到所有信号。

您可以通过让监听器识别他们所依赖的人来自动化依赖管理。监听器列表不会按插入顺序排序,而是确保依赖对象遵循其依赖关系。您的监听器界面将如下所示:

interface Listener {
String getId();
Collection<String> getDependencies();
onEvent(char e);
}

或者只提供引用文献,如下所示:

interface Listener {
Collection<Listener> getDependencies();
onEvent(char e);
}

关于java - 需要访问共享状态数据的多个监听器的正确耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com