【发布时间】:2013-05-06 02:03:34
【问题描述】:
我意识到这个话题已经被掩盖了,但我仍然在挣扎,并且可以通过一些具体的帮助来做。
我的目标是在某种可观察对象(比如说狗)和某种侦听器(比如说所有者)之间实现一个简单的观察者模式。
最终,在 MVC 范例中,所有者将是一个“视图”,而狗是一个“模型”。我使用 Dog 和 Owner 只是为了尝试简化这里的事情。
我尝试使用 Java 内置的 Observer/Observable 类,但已经意识到 Observers update() 方法有多糟糕 - 它接收一个 POJO,我需要在 update() 方法中检查/强制转换该 POJO。我更希望我的 'update()' 方法收到它可以期待的东西。
所以,我遵循了一些教程,包括这个以 Dog/Owner 为例的教程:
http://www.youtube.com/watch?v=qw0zZAte66A
这里已经向我展示了如何滚动我自己的 Observer/Observed 类。在伪代码中,我现在拥有的是:
Dog/Model {
List listeners;
public fireDogHungryEvent() {
foreach listener {
listener.onDogHungry(this);
}
}
public fireDogPeeEvent() {
foreach listener {
listener.onDogNeedsToPee(this);
}
}
public getHungerLevel() { return hungerLevel; }
public getBladderCapacity() { return bladderCapacity; }
}
Owner/View {
public onDogHungry(model) {
println(model.getHungerLevel());
}
public onDogNeedsToPee(model) {
println(model.getBladderCapacity());
}
}
所以现在我有处理特定事件的方法,而不是一个 update() 方法。杰出的。我目前对 Owner/view 类很满意。它知道 Dog/model 的方法,这很好(我认为)。
我不喜欢的是 Dog/model 引用了 Owner/view 中的方法。我已经阅读了无数次并且完全同意模型不应该与其视图紧密耦合,例如它似乎在上面。我也不热衷于 Dog/model 中的所有“火”方法做几乎相同的事情;循环遍历它的所有监听器,并在每个监听器上调用不同的方法。
是否可以进一步解耦这种关系并且不让 Dog/model 调用特定的方法?如果是这样,将狗/模型数据接收到所有者/视图并适当使用它的最佳方法是什么?
谢谢
【问题讨论】:
-
Dog的哪些方法引用了视图?我没有看到。 -
最好的方法是使用视频教程建议的界面。侦听器是您实现中的接口吗?
-
SJuan76 - 我所说的引用是在 Dog 'fire' 方法中对 listener.onDogHungry 和 listener.onDogNeedsToPee 的调用。
-
Kevin - 监听器实际上是一个接口,正如教程所建议的那样。然而,在教程结束时,我仍然需要从可观察方法调用侦听器方法。
标签: java model-view-controller observer-pattern loose-coupling