我不确定为什么要使用它。有人可以解释一下吗?
这是我的原始求助帖子,有人告诉我要使用监听器。链接
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--
和输出)都会执行。它的好处在于,您的代码完全与我的代码解耦,您的代码不知道我在打印什么,我在递减哪个变量等。
listeners
对象是如何定义的?它是一个ArrayList吗? - Tobia监听器是Java中实现观察者 设计模式的一种常见形式。这种技术也被称为回调, 这个术语来自过程式语言的世界。
观察者通过可观察对象注册自己,可观察对象在某些事件发生或需要通知观察者时回调观察者。
许多框架库扮演了可观察对象的角色,例如:
Java代码示例:
第一部分 - 可观察实体
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
// ...
}
}
第二部分 - 观察者/监听器接口
public interface Observer {
void onSomethingHappened(String whatHappened);
}
public class MyObserver implements Observer {
@Override
public void onSomethingHappened(String whatHappened) {
System.out.println(whatHappened);
}
}
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!
当事件发生时,监听器会执行一些工作。它们被称为“事件监听器”。 例如,我们在Java中有ActionListener接口。当事件发生时,它调用actionPerformed()方法。 您可以参考http://java.about.com/od/a/g/Actionlistener.htm获取更多信息。
监听器用于通知状态变化。大部分时间你可以将监听器视为观察者,所以每当有有趣的事情发生时,你的监听器将被调用。
你可以在以下网站上了解更多关于Java中的设计模式:
http://www.journaldev.com/1739/observer-design-pattern-in-java-example-tutorial
http://www.developer.com/java/implementing-behavioral-patterns-in-java.html