【问题标题】:Observer pattern on GWTGWT 上的观察者模式
【发布时间】: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


【解决方案1】:

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

有几个框架可以实现这一点,例如帖子Best data binding solution for GWT。我用过GWT Pectin,还有GWT Editors framework(我自己还没用过,因为它比较新)。

看你的代码,我觉得你可能想更清楚地将模型与视图分开:你的模型类(Country)不应该知道视图类,也就是说,它不应该存储对@的引用987654328@.

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多