Java 中侦听器的目的是什么?
我在网上寻找这个,但找不到足够的解释它到底做了什么。我看到的是一个Java接口,它作为参数在另一个类中作为“监听器”传递。人们将各种侦听器添加到列表中,并通过单个方法调用它们。
我不知道为什么我会使用它。有人可以关心解释吗?
这是我的原始帮助帖子,有人告诉我使用听众。
我在网上寻找这个,但找不到足够的解释它到底做了什么。我看到的是一个Java接口,它作为参数在另一个类中作为“监听器”传递。人们将各种侦听器添加到列表中,并通过单个方法调用它们。
我不知道为什么我会使用它。有人可以关心解释吗?
这是我的原始帮助帖子,有人告诉我使用听众。
在您链接的代码示例中KillMonsterEventListener
public interface KillMonsterEventListener {
void onKillMonster ();
}
为 API 的用户提供了一种告诉您类似如下内容的方法:
下面是一段代码。当怪物被杀时,把它叫回来。我将决定该怎么做。
这是我在执行流中的特定点(特别是,在杀死怪物时)插入代码的一种方式。我可以做这样的事情:
yourClass.addKillMonsterEventListener(
new KillMonsterEventListener() {
public onKillMonster() {
System.out.println("A good monster is a dead monster!");
}
}
);
在其他地方,我可以添加另一个侦听器:
yourClass.addKillMonsterEventListener(
new KillMonsterEventListener() {
public onKillMonster() {
monsterCount--;
}
}
);
当你的代码通过关于杀死怪物的听众列表时,即
for (KillMonsterEventListener listener : listeners) {
listener.onKillMonster()
}
我的代码片段(即和打印输出)都被执行。它的好处是你的代码完全与我的代码分离:它不知道我正在打印什么,我正在递减什么变量,等等。monsterCount--
侦听器是在 Java 中实现观察器设计模式的常见形式。这种技术也被称为回调,它是一个来自过程语言世界的术语。
观察者通过可观察对象注册自己,每当某些事件发生或应该通知他们某些事情时,观察者又会回调观察者。
许多框架库扮演着可观察的角色,例如:
Java 代码中的示例:
第 1 部分 - 可观察实体
import java.util.LinkedList;
import java.util.List;
public class Observable {
private List<Observer> observers;
public Observable() {
observers = new LinkedList<>();
}
public void addObsever(Observer observer) {
observers.add(observer);
}
private void notifyObservers(String whatHappened) {
for (Observer observer : observers) {
observer.onSomethingHappened(whatHappened);
}
}
public void doSomeStuff() {
// ...
// Do some business logic here.
// ...
// Now we want to notify all the listeners about something.
notifyObservers("We found it!");
// ...
// Do some business logic here
// ...
}
}
第 2 部分 - 观察者/侦听器接口
public interface Observer {
void onSomethingHappened(String whatHappened);
}
第 3 部分 - 观察器/侦听器接口的基本实现
public class MyObserver implements Observer {
@Override
public void onSomethingHappened(String whatHappened) {
System.out.println(whatHappened);
}
}
第 4 部分 - 将它们放在一起
public class Main {
public static void main(String[] args) {
// Create the observable.
Observable myObservable = new Observable();
// Create the observers (aka listeners).
Observer myObserverA = new MyObserver();
Observer myObserverB = new MyObserver();
// Register the observers (aka listeners).
myObservable.addObsever(myObserverA);
myObservable.addObsever(myObserverB);
myObservable.doSomeStuff();
}
}
标准输出的结果将是:
We found it!
We found it!