用于订阅的 Java 侦听器设计模式

Posted

技术标签:

【中文标题】用于订阅的 Java 侦听器设计模式【英文标题】:Java Listener Design Pattern for Subscribing 【发布时间】:2011-06-13 09:20:55 【问题描述】:

我正在尝试设计一个类似于 c# 委托概念的 Java 系统。

这是我希望实现的基本功能:

public class mainform

   public delegate onProcessCompleted
//......
    processInformation()
    
            onProcessCompleted(this);
    

//......



//PLUGIN

public class PluginA

        public PluginA()
        
            //somehow subscribe to mainforms onProcessingCompleted with callback myCallback()
        

        public void myCallback(object sender)
        
        



我已经阅读了这个网站:http://www.javaworld.com/javaqa/2000-08/01-qa-0804-events.html?page=1

他们提到手动实施整个“订阅列表”。但是代码不是一个完整的示例,而且我已经习惯了 c#,以至于我无法掌握如何在 java 中做到这一点。

有没有人有一个我可以看到的工作示例?

谢谢 斯蒂芬妮

【问题讨论】:

【参考方案1】:

在 Java 中,您没有函数委托(实际上是方法引用);您必须传递实现某个接口的整个类。例如

class Producer 
  // allow a third party to plug in a listener
  ProducerEventListener my_listener;
  public void setEventListener(ProducerEventListener a_listener) 
    my_listener = a_listener;
  

  public void foo() 
    ...
    // an event happened; notify the listener
    if (my_listener != null) my_listener.onFooHappened(new FooEvent(...));
    ...
  



// Define events that listener should be able to react to
public interface ProducerEventListener 
  void onFooHappened(FooEvent e);
  void onBarOccured(BarEvent e);
  // .. as many as logically needed; often only one



// Some silly listener reacting to events
class Consumer implements ProducerEventListener 
  public void onFooHappened(FooEvent e) 
    log.info("Got " + e.getAmount() + " of foo");
  
  ...


...
someProducer.setEventListener(new Consumer()); // attach an instance of listener

您通常有一些通过匿名类创建的微不足道的侦听器:

someProducer.setEventListener(new ProducerEventListener()
  public void onFooHappened(FooEvent e) 
    log.info("Got " + e.getAmount() + " of foo");
      
  public void onBarOccured(BarEvent e)  // ignore
);

如果您希望每个事件允许多个侦听器(例如 GUI 组件),您可以管理一个您通常希望同步的列表,并让 addWhateverListenerremoveWhateverListener 管理它。

是的,这非常麻烦。你的眼睛不会骗你。

【讨论】:

以上是关于用于订阅的 Java 侦听器设计模式的主要内容,如果未能解决你的问题,请参考以下文章

波哥带你探寻SpringBoot中优雅设计监听器的本质

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

Java 设计模式 观察者模式

Java设计模式之观察者模式

发布和订阅模式

Java常用设计模式——观察者模式