【发布时间】:2011-03-25 12:25:54
【问题描述】:
你好!我对 GWT 和 java 编程(或 OOP)都比较陌生,所以提前为初学者的问题/错误道歉。我一直在尝试创建某种观察者模式,但开发模式控制台不断丢弃错误消息,遗憾的是,它们远没有帮助。
这就是我想要实现的目标: - 我有一个由 Country 类组成的模型,并存储了一个名为 Influence 的值。 - 视图是名为 CountryDisplay 的类。这是一个 GWT 小部件,应该始终显示给定国家/地区的当前影响力。
public class Country {
private int influece;
private CountryDisplay display;
public Country() {
influence = 0;
}
public void setDisplay(CountryDisplay display) //...
public int getInfluence() //...
public void setInfluence(int value) {
influence = value;
display.update();
}
}
public class CountryDisplay {
private Country country;
public CountryDisplay (Country country) {
//GWT widget creating stuff
this.country = country;
}
public void update() {
//InfluenceCounter is a simple Label
InfluenceCounter.setText(Integer.toString(country.getInfluence()));
}
}
然后在 EntryPoint 类中我做这样的事情:
Country italy = new Country();
CountryDisplay italyDisplay = new CountryDisplay(italy);
italy.setDisplay(italyDisplay);
RootPanel.get("nameFieldContainer").add(italyDisplay);
italy.setInfluence(3);
开发控制台显示“display.update();”行有问题在班级国家。我的第一个猜测是问题在于显示没有启动,所以我为它创建了一个接口,并在 Country 构造函数中创建了一个空的新显示,稍后将被覆盖。
public Country() {
influence = 0;
display = new DisplayInterface() {
public void update() {}
}
}
但我也没有这种运气。我猜这种交叉引用是不允许的?我的意思是视图将模型作为变量,反之亦然。 单独调用视图上的方法时(例如:
italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();
) 它可以工作,所以问题肯定出在观察者逻辑上。
【问题讨论】:
-
您的原始代码对我来说似乎没问题。当您调用
update时,您确定display字段已正确初始化吗?最好在调用display.update()之前添加一个调试点(日志/Window.alert),以确保(还要确保它已初始化为null)。另一个可能的陷阱:setDisplay方法使用display作为参数 - 你确定它没有阻塞显示字段吗? -
哇,不错的收获。在原始代码中,我在 Country 构造函数中使用了 setInfluence 方法,而不是像这里那样只设置影响值,而且我在初始化之前就这样做了。现在我为首先提出这个问题而感到羞耻。谢谢,并发布一个答案,以便我接受!
-
不是您问题的答案,但您的代码似乎与 GWT 团队在下一版本的 GWT 中引入的 MVP 模式非常相似。也许你想看看它:code.google.com/webtoolkit/articles/mvp-architecture.html。它绝对简化了很多事情!
标签: model-view-controller gwt observer-pattern