我意识到这个问题已被覆盖到死亡,但我仍然挣扎,并可以做一些具体的帮助。松散耦合的观察者模式
我的目标是在某种可观察的(让我们说一个Dog)和某种监听器(让我们说Owner)之间实现一个简单的Observer模式。
最终,所有者将是一个'视图'和一个MVC范式中的'模型'。我正在使用Dog和Owner来尝试并简化这里的事情。我已经尝试使用内建在Observer/Observable类中的Java,但已经意识到Observers update()方法有多糟糕 - 它接收到一个POJO,并且我需要在update()方法中检查/转换POJO。我更愿意让我的'update()'方法获得它可以预期的结果。
于是,我跟着一些教程,包括这一个,它使用狗/业主为例:
http://www.youtube.com/watch?v=qw0zZAte66A
在这里,我已经展示了如何推出自己的观察/观察类。在伪代码中,我现在拥有的是:
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”的哪些方法引用了视图?我没有看到任何。 – SJuan76 2013-05-11 14:53:19
最好的方法是使用视频教程建议的界面。监听器是您实现中的接口吗? – 2013-05-11 14:56:27
SJuan76 - 我正在谈论的引用是在Dog'fire'方法中调用listener.onDogHungry和listener.onDogNeedsToPee。 – whoshotdk 2013-05-11 15:31:23