观察者对象在更改其某些字段后是否可以对可观察对象调用notifyListeners()
?可能出现哪些缺点?通常,受试者有责任通知听众更改。
在将模型类包装在可观察/主题中时,我经常遇到以下问题,例如使它们在 UI 中可访问。
每当模型对象的任何字段发生更改时,我的主题应该通知其侦听器,还是应该提供某种方法setModel()
将新的模型对象作为参数,然后才通知所有侦听器?
例如:
class MyData {
String myString;
int myInt;
}
class MyDataObservable {
private MyData data;
// constructor
void setString(String string) {
data.myString = string;
notifyListeners();
}
void setInt(int num) {
data.myInt = num;
notifyListeners();
}
void notifyListeners() {...}
void addListener(Observer o) {...}
}
我不喜欢我的主题基本上反映了我的模型的所有属性......这很丑陋。
class MyDataObservable {
private MyData data;
// constructor
void setData(MyData data) {
this.data = data;
notifyListeners();
}
void notifyListeners() {...}
void addListener(Observer o) {...}
}
这种方法的缺点是,每次发生任何更改时,我都必须构建数据类的新副本,即使它只是模型类上的布尔标志。
所以我的想法是允许观察者在他们使用例如update
函数更改某些内容时通知其他听众。
还有其他更优雅的选择吗?
编辑
目前,使我的数据类成为可观察对象不是一种选择,因为我使用的框架提供了可观察的机制,该机制也可以保存业务逻辑。出于这个原因,我想解耦我的数据类和逻辑/可观察的。
在这种情况下,我会使用继承而不是组合:MyData
是Observable
而不是Observable
有MyData
。
class Observable {
Collection<Listener> listeners
void addListener(Listener l) {...}
void notifyListeners() {...}
}
class MyData extends Observable {
String myString;
int myInt;
void setString(String string) {
this.myString = string;
notifyListeners();
}
void setInt(int num) {
this.myInt = num;
notifyListeners();
}
}