GWT上的观察者模式

时间:2010-08-04 21:45:51

标签: model-view-controller gwt observer-pattern

嘿那里!我对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();

)它有效,所以问题肯定在于观察者的逻辑。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正试图将用户界面元素(您的视图类CountryDisplay)“绑定”到数据(模型类Country)。 “绑定”是指如果您更改模型数据(例如,调用italy.setInfluence(10)),则视图将自动更新以反映更改。如果您的视图提供了编辑器,您希望“绑定”也可以在另一个方向上工作。

有几个框架可以实现这一点,例如参见帖子Best data binding solution for GWT。我使用了GWT Pectin并且有GWT Editors framework(我还没有使用过它,因为它相对较新)。

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