Типичная реализация может быть такой: ваш объект является наблюдаемым.Таким образом, каждый раз, когда изменяется одно из (наблюдаемых) значений, происходит событие, и все зарегистрированные слушатели получают уведомление.Один из таких слушателей теперь будет предназначен для получения уведомления, создания и отправки EMail (Java Mail API)
Давайте возьмем пример bean-компонента, который мы делаем видимым:
public class Bean implements Observable{
// code to maintain listeners
private List<Listener> listeners = new ArrayList<Listener>();
public void add(Listener listener) {listeners.add(listener);}
public void remove(Listener listener) {listeners.remove(listener);}
// a sample field
private int field;
public int getField() {return field;}
public int setField(int value) {
field = value;
fire("field");
}
// notification code
private void fire(String attribute) {
for (Listener listener:listeners) {
fieldChanged(this, attribute);
}
}
}
Слушательинтерфейс:
public interface Listener {
public void fieldChanged(Object source, String attrbute);
}
Наблюдаемый интерфейс:
public interface Observable {
public void add(Listener listener);
public void remove(Listener listener);
}
И EMailer:
public class Sender implements Listener {
public void register(Observable observable) {observable.add(this);}
public void unregister(Observable observable) {observable.remove(this);}
public void fieldChanged(Object source, String attribute) {
sendEmail(source, attribute); // this has to be implemented
}
}
РЕДАКТИРОВАТЬ Исправлена ужасная ошибка вметод установки - теперь событие вызывается после свойство было установлено.И наоборот, с побочным эффектом, что если слушатель прочитал измененное свойство, он все еще видел старое, неизменное значение ...