Как избежать циклических зависимостей при проектировании двух классов с отношениями производителей/потребителей? Здесь ListenerImpl нуждается в ссылке на Broadcaster, чтобы зарегистрировать/отменить регистрацию самостоятельно, а Broadcaster нуждается в обращении к Listeners для отправки сообщений. Этот пример представлен на Java, но он может применяться к любому языку OO.Как избежать циклических зависимостей при использовании обратных вызовов?
public interface Listener {
void callBack(Object arg);
}
public class ListenerImpl implements Listener {
public ListenerImpl(Broadcaster b) { b.register(this); }
public void callBack(Object arg) { ... }
public void shutDown() { b.unregister(this); }
}
public class Broadcaster {
private final List listeners = new ArrayList();
public void register(Listener lis) { listeners.add(lis); }
public void unregister(Listener lis) {listeners.remove(lis); }
public void broadcast(Object arg) { for (Listener lis : listeners) { lis.callBack(arg); } }
}
Но есть еще ссылка цикла - вещатель имеет ссылку к конкретному объекту ListenerImpl, хотя тип ссылки - тип интерфейса Listener. Не указывает ли цикл ссылок на цикл зависимостей? – 2008-09-29 16:55:31
На самом деле нет способа удалить ссылочный цикл. Это отчасти требуется для этого типа вещей. В эти дни эталонные циклы не являются проблемой, учитывая, что любой хороший сборщик мусора должен прекрасно их обрабатывать. Это циклы зависимостей, о которых вам нужно беспокоиться. – Herms 2008-09-29 17:05:56