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

Jac*_*lan 9 java listener

我在网上寻找这个,但找不到它究竟是什么的充分解释.我看到的是一个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--和打印输出)都被执行了.关于它的好处是你的代码完全与我的代码分离:它不知道我在打印什么,我正在减少什么变量,等等.


Mar*_*nCz 7

侦听器是在Java 中实现观察器 设计模式的一种常见形式。此技术也称为回调,这是一个来自过程语言世界的术语。

观察者通过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
        // ...
    }
}
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)


Hoo*_*pje 6

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

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