Model view controller GWT上的观察者模式

Model view controller GWT上的观察者模式,model-view-controller,gwt,observer-pattern,Model View Controller,Gwt,Observer Pattern,嘿!关于这一点,我对GWT和java编程或OOP都比较陌生,因此请提前为初学者的问题/错误道歉。我一直在尝试创建某种观察者模式,但是开发模式控制台不断地丢弃错误消息,不幸的是,它们根本没有帮助 以下是我想要实现的目标: -我得到了一个由国家阶级组成的模型,它存储了一个叫做影响力的值。 -该视图是名为CountryDisplay的类。它是一个GWT小部件,应该始终显示给定国家的当前影响力 public class Country { private int influece; priv

嘿!关于这一点,我对GWT和java编程或OOP都比较陌生,因此请提前为初学者的问题/错误道歉。我一直在尝试创建某种观察者模式,但是开发模式控制台不断地丢弃错误消息,不幸的是,它们根本没有帮助

以下是我想要实现的目标: -我得到了一个由国家阶级组成的模型,它存储了一个叫做影响力的值。 -该视图是名为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);
开发控制台表明它的line display.update有问题;在阶级国家。我的第一个猜测是,问题是显示没有启动,所以我为它创建了一个接口,在Country构造函数中,我创建了一个空的新显示,稍后将被覆盖

   public Country() {
      influence = 0;
      display = new DisplayInterface() {
          public void update() {}
      }
   }  
但我也没有这样的运气。我猜这种交叉引用是不允许的?我的意思是视图将模型作为变量,反之亦然。 单独调用视图上的方法时,如:

italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();

它可以工作,因此问题肯定出在观察者逻辑中。

如果我理解正确,您正在尝试将用户界面元素绑定到视图类CountryDisplay到模型类Country的数据。绑定的含义是,如果更改模型数据(例如,调用Itality.setInfluence10),则视图将自动更新自身以反映更改。如果您的视图提供了一个编辑器,那么您希望绑定也朝着另一个方向工作

有几种框架可以实现这一点,例如,请参见本文。我已经用过了,还有一些我自己还没有用过的,因为它是比较新的


查看您的代码,我觉得您可能希望更清楚地将模型与视图分开:您的模型类Country不应该知道视图类,也就是说,它不应该存储对CountryDisplay的引用。

您的原始代码在我看来还可以。您确定在调用update时显示字段已正确初始化吗?最好在调用display.update之前添加调试点log/Window.alert,以确保它已初始化为null。另一个可能的陷阱:setDisplay方法使用display作为参数-你确定它没有阻塞display字段吗?哇,很好的catch adamk。在原始代码中,我在Country构造函数中使用了setInfluence方法,而不是像这里那样设置影响值,我在初始化之前就这样做了。现在我为一开始就提出这个问题感到羞愧。谢谢,并张贴一个答案,这样我就可以接受它!这不是对您问题的回答,但您的代码似乎与GWT团队在下一版本GWT中引入的MVP模式非常相似。也许你想看看它:。它确实简化了很多事情!