java - 如何观察可观察类的属性

标签 java design-patterns observer-pattern

我有以下类(class)

public class A extends java.util.Observable {
private B property1;
private C property2;
int variable1;

/*Setters and getters**/
}

我将这个类设置为 Observable 以便我可以收到 variable1 的任何更改通知。现在我想收到 B 或 C 类型属性内变量变化的通知。由于属性 B 和 C 的变量未从类 A 中的 setter 方法更改,所以我无法在发生更改时通知观察者。

在不在观察者代码中显式注册类 B 和 C 的情况下通知观察者的最佳方式是什么?我只想观察属于 A 类的所有属性。

最佳答案

调用 notifyObservers() 之一Observable 的状态改变时的方法。它们可能不会被 setter 方法显式修改,但如果你有正确的 encapsulated访问您的 BC 对象,然后您就可以开始了。

不过,在我看来,就像允许对 BC 的引用继续存在于类 A 对象之外.这样做的结果是您的系统现在依赖于类 A 的实现,而不是它的接口(interface)。通过以下方式解决此问题:

  1. 首选 不允许系统的其余部分访问 BC 类,并且必须通过 类来处理所有事情>一个
  2. HackBC 也扩展 Observable,并让它们更新 A 当它们也改变时。

代码示例

public class A extends java.util.Observable {
  private B property1;
  private C property2;
  int variable1;

  public void doThatThingy() {
    property1.doSomething();
    notifyObservers();
  }
}

public class B {
  void doSomething() {
    // Hey look at me, I'm doing something
  }
}

不要做

public B getB() {
  return property1;
}

关于java - 如何观察可观察类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24264366/

相关文章:

javascript - 运行观察者模式示例时遇到问题

java - 嵌套事务回滚时出现"java.sql.SQLException: SAVEPOINT _667166fe_13ab4b3e3de__8000 does not exist"异常?

java - 如何在 Spring 中为包(包括子包)中的每个 bean id 添加常量字符串前缀?

java - 服务层中的 hibernate/spring 验证

iOS : passing data between viewController (destination embedded in a NavigationController)

c# - 可选的设计模式,优势

java - 无法以 XML 格式编码 REST

java - 使用 Java append 到压缩流

Java - 将观察者模式与计时器任务结合起来?

java - 为复杂属性实现 Java 观察者模式的最佳方法