Я пытался безрезультатно заставить шаблон наблюдателя работать в относительно простом приложении.
У меня есть 4 класса GUI
- StarterClass (содержит
CompositeWordLists
и CompositeWordListData
) - CompositeWordLists (содержит много
CompositeListItem
/ s и CompositeWordListData
) - CompositeWordListData (содержит
DialogWordData
)
Вот мой Observable
interface Observable<T> {
void addObserver(T o);
void removeObserver(T o);
void removeAllObservers();
void notifyObservers();
}
И я создаю Обозреватели вот так:
public class Observers {
private Observers(){};
interface WordListsObserver {
public void update(CompositeWordLists o);
}
interface ListItemObserver {
public void update(CompositeListItem o);
}
}
В основном у меня возникают проблемы с указанием типа события, которое произошло.Например, класс CompositeWordLists
должен знать, когда CompositeListItem
удален, сохранен, отредактирован и т. Д., Но у меня есть только один метод обновления ... у меня сейчас болит мозг!
Как лучше это сделать?
ОБНОВЛЕНИЕ
Все еще испытывая проблемы с этим, я добавил события и изменил Observable и Observers, но теперь у меня есть типпроблемы безопасности.
public class Observers {
private Observers(){};
/**
* @param <T> the object that is passed from the Observable
*/
interface ObservableEvent<T> {
T getEventObject();
}
/**
* Get notified about Authentication Attempts
*/
interface ObserverAuthenticationAttempt {
/**
* @param e true if authentication was successful
*/
public void update(ObservableEvent<Boolean> e);
}
/**
* Get notified about a Word Deletion
*/
interface ObserverWordDeleted {
/**
* @param e the id of the word that was deleted
*/
public void update(ObservableEvent<Integer> e);
}
}
Наблюдаемый интерфейс теперь выглядит следующим образом
interface Observable<T> {
void addObserver(T o);
void removeObserver(T o);
void removeAllObservers();
<K> void notifyObservers(Observers.ObservableEvent<K> e);
}
Проблема заключается в том, что когда я его реализую, я получаю и должен приводить K к соответствующему типу, а недействительно, что я хочу сделать.
@Override
public <K> void notifyObservers(ObservableEvent<K> e) {
for(Observers.ObserverAuthenticationAttempt o : this.observers)
o.update(e);
}
Что я делаю не так?
обновление 2
На самом деле это работает лучше с Observable, как это, но мне все еще нужночтобы указать правильный EventType в двух разных местах.
interface Observable<T,K> {
void addObserver(T o);
void removeObserver(T o);
void removeAllObservers();
void notifyObservers(Observers.ObservableEvent<K> e);
}