如何观察可观察类的属性

时间:2014-06-17 12:52:42

标签: java design-patterns observer-pattern

我有以下课程

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方法改变,因此我无法在发生更改时通知Observer。

如果没有在观察者代码中明确注册类B和C,通知观察者的最佳方法是什么?我只想观察属于A类的所有属性。

1 个答案:

答案 0 :(得分:1)

Observable状态发生变化时,请调用其中一种notifyObservers()方法。它们可能不会被setter方法明确修改,但如果您正确encapsulated访问BC个对象,那么您应该很高兴。

但是,听起来,我们允许BC的引用继续存在于您的类A对象之外。这样做的结果是您的系统现在依赖于类A的实现,而不是它的接口。通过以下方式解决这个问题:

  1. 首选不允许您系统的其余部分访问课程BC,并且必须通过课程A开展所有工作
  2. 黑客BC也展开Observable,让他们在更改时更新A

  3. 代码示例

    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;
    }