【发布时间】:2010-11-26 07:35:11
【问题描述】:
我一直试图让观察者模式在一个相对简单的应用程序中工作,但无济于事。
我有 4 个 GUI 类
-
StarterClass(包含
CompositeWordLists和CompositeWordListData) -
CompositeWordLists(包含多个
CompositeListItem/s 和一个CompositeWordListData)- CompositeListItem
-
CompositeWordListData(包含
DialogWordData)- 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);
}
}
Observable 接口现在看起来像这样
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);
}
【问题讨论】:
标签: java observer-pattern