OOP 观察者模式:从主题外部调用 notifyListener



观察者对象在更改其某些字段后是否可以对可观察对象调用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函数更改某些内容时通知其他听众。

还有其他更优雅的选择吗?

编辑

目前,使我的数据类成为可观察对象不是一种选择,因为我使用的框架提供了可观察的机制,该机制也可以保存业务逻辑。出于这个原因,我想解耦我的数据类和逻辑/可观察的。

在这种情况下,我会使用继承而不是组合:MyDataObservable而不是ObservableMyData

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();
}
}

最新更新