0

我正在学习 OOP 并尝试编写一个简单的程序,该程序将在每次特定变量发生变化时执行某些方法。我有两节课:

public class SomeClass {

  private OtherClass object;

  public OtherClass getObject() {
    return this.object;
  }

  public void setObject(OtherClass object) {
    objectChanged();
    this.object = object;
  }

  private void objectChanged() {
    System.out.println("Object has changed");
  }
}


public class OtherClass {

  private int value = 5;

  public int getValue() {
    return this.value;
  }

  public void setValue(int value) {
    this.value = value;
  }
}

每次更改变量“object”时,都应调用变量 objectChanged。我的第一个天真的想法是将方法调用放在 set 函数中。但是,如果在设置后更改对象怎么办?像这样:

SomeClass someObject = new SomeClass();
OtherClass otherObject = new OtherClass();
someObject.setObject(otherObject); //"Object has changed"
otherObject.setValue(10); //nothing happens yet

我需要 someObject 来实现存储在其中的对象将其值更改为 10,但我该怎么做呢?在OOP中甚至可能吗?

4

1 回答 1

0

这看起来是合理的,但人们应该考虑很多事情。这就是为什么通常没有自动的方法来做到这一点。它不是 OOP 范式本身的一部分。如果这将是一些自动行为,则会导致巨大的开销,因为通常不需要以这种方式观察更改。但是您当然可以根据您的具体要求实施您的方式。

至少有两种方法。

在 MVVM(如 WPF)中有一个INotifyPropertyChanged接口(我们称之为模式),您可以使用它来自己触发通知,就像您使用SomeClass. 但是,当您嵌套对象时,您需要将该机制连接起来。级联:您应该对实际实例进行相同操作,OtherClass并将实际实例连接起来以进行更改。请参阅:https ://rehansaeed.com/tag/design-patterns/

另一种选择是Observable模式。每次对象更改状态时,您都会发出一个实例 - 当前实例。但是,您应该注意发出不可变对象。至少通过使用使其只读的接口。但是您仍然需要连接对象树以对嵌套对象的更改做出反应。

如果您的平台支持反射,并且您创建了一个适当的工具集,那么您可以使这种连接变得非常简单。但同样:这与范式并不严格相关。

于 2019-12-01T12:39:39.563 回答