如何理解我班级财产的财产是否发生了变化

时间:2014-06-17 10:58:28

标签: 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 getMember() {
         return member;
    }
    public void setMember(A member) {
          this.member = member;
    }
}

我想要做的是在A类中的整数被更改时通知B类。

我希望在不使用Observable和Observer的情况下拥有通知机制。有任何想法吗 ?除观察者模式外是否有合适的模式?

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

中的变化
  

私人成员A;

2 个答案:

答案 0 :(得分:0)

将您的类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
  }
}

替代方案您也可以使用类Proxy,但接口是首选方法。

答案 1 :(得分:-1)

如果是合理的,你可以尝试使A类不可变。然后,当您更改A时,您真正要做的是构造一个新的不可变对象(如String)。然后,为了机会A,你必须使用B的set方法在你改变任何东西时用新的A代替A.

这个模式对于客户端来说有点难用,但它确实意味着会自动通知B类,因为你只能通过调用set方法来改变B中A的一部分。

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