手っ取り早くイベントソース

 別にJavaBeansでないと利用できないわけではなし

DingEvent.java

import java.beans.PropertyChangeEvent;

public class DingEvent extends PropertyChangeEvent {
    public DingEvent(Object source) {
        super(source, null, null, null);
    }
}

DingListener.java

import java.beans.PropertyChangeListener;

public interface DingListener extends PropertyChangeListener {
}

Bell.java

import java.beans.PropertyChangeSupport;

public class Bell {
    private PropertyChangeSupport support = new PropertyChangeSupport(this);
    private String name;

    public Bell(String name) {
        this.name = name;
    }

    public void addDingListener(DingListener listener) {
        support.addPropertyChangeListener(listener);
    }

    public void removeDingListener(DingListener listener) {
        support.removePropertyChangeListener(listener);
    }

    public void ring() {
        support.firePropertyChange(new DingEvent(this));
    }

    @Override
    public String toString() {
        return name;
    }
}

Cittadino.java

import java.beans.PropertyChangeEvent;

public class Cittadino implements DingListener {
    public void propertyChange(PropertyChangeEvent e) {
        if (e instanceof DingEvent) {
            System.out.println(e.getSource() + ": dingdong");
        }
    }
}

BellRinger.java

public class BellRinger {
    public static void main(String[] args) {
        Bell bell = new Bell("Nona la campana");
        bell.addDingListener(new Cittadino());
        bell.ring();
    }
}