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

2022-09-03 03:41:05

我在网上寻找这个,但找不到足够的解释它到底做了什么。我看到的是一个Java接口,它作为参数在另一个类中作为“监听器”传递。人们将各种侦听器添加到列表中,并通过单个方法调用它们。

我不知道为什么我会使用它。有人可以关心解释吗?

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

链接


答案 1

在您链接的代码示例中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--


答案 2

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

观察者通过可观察对象注册自己,每当某些事件发生或应该通知他们某些事情时,观察者又会回调观察者

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

  • 您将自己(即侦听器接口的实现)注册为消息传递中间件中传入消息的侦听器。
  • 您将自己注册为用户在操作系统中所做的某些更改的侦听器。
  • 您将自己注册为 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!

推荐