爪哇。实现监听器的正确模式

新手上路,请多包涵

通常情况下,我会遇到一个给定对象需要有很多侦听器的情况。例如,我可能有

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

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

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

尽管

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

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

原文由 Jake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 292
1 个回答

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

TigerListener 和 ElephentListener 然后变成

interface TigerListener {
    void listen(Event event);
}

事实上,您可以进一步将此接口重构为普通的 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) {
                ...
            }
        }
    }
}

订阅者和发布者之间的关键关系是发布者可以向订阅者发送事件,不一定可以向订阅者发送某些类型的事件——这种类型的重构将逻辑从接口向下推到具体的实现中.

原文由 matt b 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题