gpt4 book ai didi

java 。实现监听器的正确模式

转载 作者:IT老高 更新时间:2023-10-28 20:32:54 24 4
gpt4 key购买 nike

通常情况下,给定对象需要有许多监听器。例如,我可能有

class Elephant {
public void addListener( ElephantListener listener ) { ... }
}

但我会遇到很多这样的情况。也就是说,我还将有一个 Tiger 对象,该对象将具有 TigerListener。现在,TigerListeners 和 ElephantListeners 是完全不同的:

interface TigerListener {
void listenForGrowl( Growl qrowl );
void listenForMeow( Meow meow );
}

同时

interface ElephantListener {
void listenForStomp( String location, double intensity );
}

我发现我总是要不断地在每个动物类中重新实现广播机制,而且实现总是一样的。有首选模式吗?

最佳答案

不是每个 Listener 都有您可以发送的每种事件类型的特定方法,而是更改接口(interface)以接受通用 Event 类。然后,您可以根据需要将 Event 子类化为特定的子类型,或者让它包含诸如 double intensity 之类的状态。

TigerListener 和 ElephantListener 然后变成

interface TigerListener {
void listen(Event event);
}

事实上,你可以进一步将这个接口(interface)重构为一个普通的Listener:

interface Listener {
void listen(Event event);
}

然后,您的 Listener 实现可以包含他们关心的特定事件所需的逻辑

class TigerListener implements Listener {
@Overrides
void listen(Event event) {
if (event instanceof GrowlEvent) {
//handle growl...
}
else if (event instance of MeowEvent) {
//handle meow
}
//we don't care about any other types of Events
}
}

class ElephentListener {
@Overrides
void listen(Event event) {
if (event instanceof StompEvent) {
StompEvent stomp = (StompEvent) event;
if ("north".equals(stomp.getLocation()) && stomp.getDistance() > 10) {
...
}
}
}
}

订阅者和发布者之间的关键关系是发布者可以向订阅者发送事件,不一定可以向订阅者发送特定类型的事件——这种类型的重构将接口(interface)中的逻辑向下插入具体实现。

关于 java 。实现监听器的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com