Java 中监听器的用途是什么?

What is the purpose of a listener in Java?

我在网上找过这个,但找不到对它到底做什么的充分解释。我看到的是一个 Java 接口,它在另一个 class 中作为参数传递为 "Listener"。人们将各种侦听器添加到列表中,并通过单一方法调用它们。

我不确定为什么要使用它。有人可以解释一下吗?

这是我最初的帮助post,有人告诉我使用侦听器。

使用侦听器让其他代码通知您 "conditions"/"events"。例如,如果鼠标是 moved/clicked/dragged,则可以调用 "mouse listener"。这取决于您的应用程序为什么提供侦听器。

监听器在事件发生时做一些工作。它们被称为 "Event Listeners"。 点击、悬停等事件。 例如,我们在 Java 中有 ActionListener 接口。它在事件发生时调用 actionPerformed() 方法。 您可以参考 http://java.about.com/od/a/g/Actionlistener.htm 了解更多信息。

侦听器用于通知状态更改。在大多数情况下,您可以将 Listeners 视为 Observer,因此每次发生有趣的事情时,您的 Listener 都会被调用。

您可以在以下网站的 Java 中阅读有关模式的更多信息:

http://www.journaldev.com/1739/observer-design-pattern-in-java-example-tutorial

http://www.developer.com/java/implementing-behavioral-patterns-in-java.html

在您链接 KillMonsterEventListener

的代码示例中
public interface KillMonsterEventListener {
    void onKillMonster ();
}

为您 API 的用户提供了一种方式来告诉您这样的事情:

Here is a piece of code. When a monster is killed, call it back. I will decide what to do.

这是我在执行流中的特定点(特别是在怪物被杀死的点)插入我的代码的一种方式。我可以这样做:

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-- 和打印输出)都被执行了。它的好处是你的代码与我的代码完全分离:它不知道我在打印什么,我在递减什么变量,等等。

这是称为 event-driven programming 的编程范例的一部分。对象在某些情况下会向其他对象发送消息,例如当它们发生变化时。这在 GUI 编程中经常使用。每个 GUI 小部件由 class 实现。当你想处理例如当用户点击鼠标时,您会向 GUI 小部件添加一个侦听器(也称为事件处理程序)。当用户单击小部件时,小部件会将事件发送到已注册的侦听器,以便应用程序可以响应鼠标单击。这将框架(GUI 小部件 class)和应用程序代码分开。 (在某些 GUI 框架中,例如 Swing,您可以为一个对象添加任意数量的侦听器;在其他框架中,您只能指定一个。)

事件驱动编程在其他领域也很有用。您可能想要观察一个对象(参见 Observer pattern)。例如,支持此功能的集合可能会在其内容更改时发送事件。如果出现这种情况需要进行一些处理,可以将自己添加为这个 class 的监听​​器。另一种方法是每次将项目添加到集合中时调用 post-processing,但这很容易出错。

Listener 是实现 observer design patter in Java. This technique is also referred to as the callback 的常见形式,这是一个来自过程语言世界的术语。

Observers 通过 observable 注册自己,后者会在任何时候回调 observers某些事件发生或何时应通知他们。

许多框架库扮演可观察者的角色,例如:

  • 您将自己(即您的侦听器接口的实现)注册为消息传递中间件中传入消息的侦听器。
  • 您将自己注册为用户在操作系统中所做的某些更改的侦听器。
  • 您将自己注册为 GUI 事件的侦听器,例如单击按钮。

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 部分 - observer/listener 界面

public interface Observer {
    void onSomethingHappened(String whatHappened);
}

第 3 部分 - observer/listener 接口的基本实现

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!

Servlet Listener用于监听web容器中的事件,比如当你创建一个会话或者在一个会话中放置一个属性或者如果你在另一个容器中钝化和激活,订阅这些事件你可以配置web.xml 中的侦听器,例如 HttpSessionListener.

侦听器会针对可附加到应用服务器中的事件的实际物理请求触发。使用侦听器,您可以跟踪应用程序级别、会话级别、生命周期更改、属性更改等。

您可以通过定义在生命周期事件发生时调用其方法的侦听器对象来监视和响应 servlet 生命周期中的事件。

这是 Servlet Listener 的博客 post http://array151.blogspot.in/2016/12/servlet-listener.html