Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何观察可观测类的性质_Java_Design Patterns_Observer Pattern - Fatal编程技术网

Java 如何观察可观测类的性质

Java 如何观察可观测类的性质,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,我有以下课程 public class A extends java.util.Observable { private B property1; private C property2; int variable1; /*Setters and getters**/ } 我将这个类设置为可观察的,这样就可以通知我变量1中的任何更改。现在我想知道类型B或C的属性中变量的变化。因为属性B和C的变量没有从类A中的setter方法中改变,所以当发生变化时,我不能通知观察者 通知观察者而不在观察者代

我有以下课程

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

/*Setters and getters**/
}
我将这个类设置为可观察的,这样就可以通知我变量1中的任何更改。现在我想知道类型B或C的属性中变量的变化。因为属性B和C的变量没有从类A中的setter方法中改变,所以当发生变化时,我不能通知观察者

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

当您的
可观察的
状态更改时,调用其中一个方法。setter方法可能不会显式地修改它们,但是如果您已经正确地访问了
B
C
对象,那么您就可以开始了

不过,在我听来,似乎允许对
B
C
的引用继续存在于类
A
对象之外。这样做的结果是,您的系统现在取决于类
A
的实现,而不是它的接口。通过以下方式解决此问题:

  • 首选不允许系统的其余部分访问class
    B
    C
    ,并且必须通过class
    A处理所有问题
    • 关于为什么应该这样做,而不是允许其他类直接获取
      B
      C
      的引用
  • Hack使
    B
    C
    也扩展
    可观察
    ,并在更改时更新
    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
      }
    }
    
    不做
    我不知道当可观察状态发生变化时我如何理解。例如,客户端将使用getter方法获取property1中的访问权限,然后他们将使用其setter和getter修改内部字段。@Stefanos自从我第一次写这篇文章以来,我对它进行了显著的编辑。代码示例收入非常感谢您现在我明白您的意思:-)
    public B getB() {
      return property1;
    }