【问题标题】:How do I know the generic object that the Observer class sends in Java?我如何知道 Observer 类在 Java 中发送的通用对象?
【发布时间】:2012-08-24 16:29:41
【问题描述】:

我正在使用 Java 实现 Observer / Observable 模式。但是,我在代码的 Observer 部分遇到了问题。

可观察

public class Model extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<A>());
       this.notifyObservers(new ArrayList<B>());
   }
}

观察者

public class View implements Observer {

    @Override
    public void update(Observable observable, Object object) {
        // TODO: If object is ArrayList<A>?
        System.out.println("A");
        // TODO: If object is ArrayList<B>?
        System.out.println("B");
    }
}

如何填写 TODO cmets 以检查 ArrayList 上的泛型?这甚至可能吗? (如果可能的话,我宁愿在不实现更多类的情况下这样做。)

【问题讨论】:

标签: java generics observer-pattern


【解决方案1】:

Observable 应该发送一种且仅一种类型的数据。

public class ModelA extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<A>());
   }
}

public class ModelB extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<B>());
   }
}

您的另一种选择是将 ArrayList 和 ArrayList 放入一个类中。你可以用那个类通知你的观察者。

【讨论】:

  • 谢谢 - 我会把我的模型分解成更好的细分。一个附带问题:将控制器作为对象传递会更好吗?
  • @sdasdadas:这取决于你需要什么。当我需要观察者/可观察模式时,我一直在使用 Swing 中的 Listener 模型。这样,我可以决定在观察者等价物中需要哪些方法。
【解决方案2】:

您可以使用 instanceof 来查看您的对象是什么类型,但您误用了该模式。
这个想法是Observable 有一个定义良好的接口,所有Observer 需要知道的是使用 API 来传递通知。
知道Observable 到底是什么的逻辑不应混入代码中。
从您的问题对我来说,您有 2 个Observable,他们应该让他们自己的听众对他们特别感兴趣以获取通知。没有一个组合

【讨论】:

  • 你可以使用instanceof吗?我不认为您可以键入数组列表并且此信息丢失。 (虽然我同意滥用该模式)
  • 为什么 Java 允许将对象传递给观察者?我应该在对象字段中传递什么(如果有的话)?
  • @user846476:你是对的。您只能查看instanceof List 是否为@。如果是instanceof A,他可以检查元素,但即使他可以,他也错过了模式
  • @sdasdadas:你可以传入一个自定义的Object,你的听众知道如何回滚。本质上是通知对象(有与通知原因相关的信息)
猜你喜欢
  • 2013-02-11
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多