Java中监听器的目的是什么?

时间:2015-07-25 11:24:21

标签: java listener

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

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

这是我原来的帮助帖子,有人告诉我使用听众。

Link

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

监听器是在Java中实现observer design patter的常见形式。这种技术也被称为callback,这是一个来自程序语言世界的术语。

观察员通过 observable 注册自己, observable 会在某些事件发生时或者应该通知某些事件时回调观察者

许多框架库扮演着observable的角色,例如:

  • 您自己注册(即,您的侦听器接口的实现)作为消息中间件中传入消息的侦听器。
  • 您将自己注册为用户在操作系统中所做的某些更改的监听器。
  • 您将自己注册为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部分 - 观察者/听众界面

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!

答案 3 :(得分:1)

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

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

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

以下是Servlet Listener的博客文章 http://array151.blogspot.in/2016/12/servlet-listener.html

答案 4 :(得分:0)

使用监听器让其他代码通知您“条件”/“事件”。例如,如果移动/点击/拖动鼠标,则可以调用“鼠标监听器”。这取决于你的应用程序为何提供听众。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

监听器用于通知状态变化。您可以在大多数时间将听众视为观察者,因此每当有趣的事情发生时,您的听众都会被调用。

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

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

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