在事件上设置回调监听器时,通常有两种方法:
private MyEventListener listener;
...
public void setEventListener(MyEventListener listener){
this.listener = listener;
}
...
// some event later on
this.listener.callback(interestingData);
在这里,每次从客户端类设置侦听器时,都会替换现有的侦听器。只有最后设置监听器的客户端才会收到回调。
另一种方式是这样的:
private ArrayList<MyEventListener> listeners;
...
public void setEventListener(MyEventListener listener){
if (listeners == null){
listeners = new ArrayList<MyEventListener>();
}
if(!listeners.contains(listener){
listeners.add(listener);
}
}
...
// some event later on
for(MyEventListener listener:listeners){
listener.callback(interestingData);
}
第二种方法的问题是您无法控制有多少客户端接收回调,并且注册了很多客户端,它们可能会消耗大量 CPU 来处理回调。
您可以人为地限制侦听器的数量 ( if(listeners.count() < 5)
),但从 OOP 的角度来看这是没有意义的。
哪一个是正确的取决于您的设计。我通常使用后一种模式,因为我知道会有多少客户并且数量很少(通常少于 5 个)。