Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 - Fatal编程技术网

Java 如何理解我的类的属性的属性是否已更改

Java 如何理解我的类的属性的属性是否已更改,java,design-patterns,Java,Design Patterns,我有以下课程 public class A { private int number; public int getNumber(){ return number; } public void setNumber(int number){ this.number = number; } } 然后是类B,它的属性是类a的对象 public class B { private A member; public A get

我有以下课程

public class A {
   private int number;

   public int getNumber(){
       return number;
   }
   public void setNumber(int number){
       this.number = number;
   }
}
然后是类B,它的属性是类a的对象

public class B {
    private A member;

    public A getMember() {
         return member;
    }
    public void setMember(A member) {
          this.member = member;
    }
}
我想做的是在类A中的整数发生更改时通知类B

我希望通知机制不使用Observable和Observer。有什么想法吗?除了观察者模式之外,还有其他合适的模式吗

编辑:我不想再次使用observer的原因是因为类B已经扩展了java.util.Observable,我的最终目标是让类B的观察者知道

私人会员A


如果是合理的,您可以尝试使类A不可变。然后,当您更改一个对象时,您真正要做的是构造一个新的不可变对象(如字符串)。然后,若要获得机会A,则必须使用B的set方法,在更改任何内容时,将A替换为新的A

对于客户机来说,这种模式使用起来有点困难,但它确实意味着会自动通知类B,因为您只能通过调用set方法来更改B中a的一部分


基本上,当您使用此模式时,您只需想象A是一个字符串,因此创建一个新字符串,然后调用set,因为字符串是不可变的。

将类A声明为接口,并在B中返回此接口的内部委托实现(代理模式)

像这样的

public interface A {
  void setNumber(int n);
  int getNumber();
}

public class B {
  private A member;
  private class AImpl implements A {
    public void setNumber(int n) {
      member.setNumber(n);
      notifyB();
    }
    public int getNumber() {
      int res = member.getNumber();
      notifyB();
      return res;
    }
  }
  public A getMember() {
    return new AImpl();
  }
  public void setMember(A member) {
    this.member = member;
  }
  private void notifyB() {
    // notification
  }
}

或者,您也可以使用类
代理
,但接口是实现这一点的首选方法。

listener?或者你认为它类似于可观察的?是的,量子力学是可能的!说真的,简单地观察一下怎么样?一个侦听器/事件模式在这里可以很好地工作?你想实现什么?您可以使用从a到B的引用或类似事件总线的东西(例如),但在我看来,观察员最适合您的示例为什么这个奇怪的问题有三张赞成票?!