我在网上寻找这个,但找不到它究竟是什么的充分解释.我看到的是一个Java接口,它作为参数在另一个类中作为"监听器"传递.人们将各种监听器添加到列表中,并通过单个方法将它们全部调用.
我不确定为什么要使用它.有人可以解释一下吗?
这是我原来的帮助帖子,有人告诉我使用听众.
das*_*ght 11
在您链接的代码示例中 KillMonsterEventListener
public interface KillMonsterEventListener {
void onKillMonster ();
}
Run Code Online (Sandbox Code Playgroud)
为您的API用户提供了一种告诉您这样的方法:
这是一段代码.当一个怪物被杀死时,请回电话.我会决定做什么.
这是我在执行流中的特定点插入代码的一种方式(特别是在怪物被杀死时).我可以这样做:
yourClass.addKillMonsterEventListener(
new KillMonsterEventListener() {
public onKillMonster() {
System.out.println("A good monster is a dead monster!");
}
}
);
Run Code Online (Sandbox Code Playgroud)
在其他地方我可以添加另一个监听器:
yourClass.addKillMonsterEventListener(
new KillMonsterEventListener() {
public onKillMonster() {
monsterCount--;
}
}
);
Run Code Online (Sandbox Code Playgroud)
当你的代码通过杀死怪物的监听器列表时,即
for (KillMonsterEventListener listener : listeners) {
listener.onKillMonster()
}
Run Code Online (Sandbox Code Playgroud)
我的代码片段(即monsterCount--和打印输出)都被执行了.关于它的好处是你的代码完全与我的代码分离:它不知道我在打印什么,我正在减少什么变量,等等.
侦听器是在Java 中实现观察器 设计模式的一种常见形式。此技术也称为回调,这是一个来自过程语言世界的术语。
观察者通过observable进行注册,后者在发生某些事件或应通知他们某些事件时反过来回调观察者。
许多框架库都扮演着可观察的角色,例如:
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
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
第2部分-观察者/侦听器界面
public interface Observer {
void onSomethingHappened(String whatHappened);
}
Run Code Online (Sandbox Code Playgroud)
第3部分-观察者/侦听器界面的基本实现
public class MyObserver implements Observer {
@Override
public void onSomethingHappened(String whatHappened) {
System.out.println(whatHappened);
}
}
Run Code Online (Sandbox Code Playgroud)
第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();
}
}
Run Code Online (Sandbox Code Playgroud)
标准输出的结果将是:
We found it!
We found it!
Run Code Online (Sandbox Code Playgroud)
这是称为事件驱动编程的编程范例的一部分.对象在某些情况下将消息发送到其他对象,例如在更改时.这在GUI编程中经常使用.每个GUI小部件都由一个类实现.当您想要处理来自用户的鼠标点击时,您可以向GUI小部件添加一个监听器(也称为事件处理程序).当用户单击窗口小部件时,窗口小部件将事件发送到已注册的侦听器,以便应用程序可以响应鼠标单击.这将分离框架(GUI小部件类)和应用程序代码.(在某些GUI框架中,例如Swing,您可以向对象添加任意数量的侦听器;在其他框架中,您只能指定一个.)
在其他领域,事件驱动编程也很有用.您可能想要观察一个对象(请参阅观察者模式).例如,支持此功能的集合可能会在其内容发生更改时发送事件.如果您需要执行某些处理,则可以将自己添加为此类的侦听器.另一种方法是每次向集合中添加项目时调用后处理,但这容易出错.
| 归档时间: |
|
| 查看次数: |
35433 次 |
| 最近记录: |