Я играл с разными подходами к этому на протяжении многих лет. Фундаментальная вещь, которую вы можете сделать, чтобы исправить это, - это иметь модели, генерирующие события, только если они действительно меняются. Это делает модели немного более сложными для каждого класса в модели, но это единственный способ, которым мне удалось заставить эту парадигму работать.
Например
public void setColor(Color c)
{
setBackground(c);
notify(new ColorChangedEvent(this, c));
}
станет
public void setColour(Color c)
{
if (!getBackground().equals(c))
{
setBackground(c);
notify(new ColorChangedEvent(this, c));
}
}
Стандартные классы Observable в java поддерживают это с помощью метода setChanged ().
Немного более простой способ реализовать это (но IMHO не так хорошо) - заставить 'notify' отключить прослушивание до тех пор, пока не закончится уведомление. То есть уведомление выглядит как
private iAmNotifying;
public void notify(Event e)
{
if (!iAmNotifying)
{
iAmNotifying = true;
doTheActualNotification(e);
iAmNotifying = false;
}
}
Но у этого есть некоторые существенные недостатки с точки зрения гранулярности, и я добился большего успеха с первым подходом.