【问题标题】:How to understand if a property of a property of my class has changed如何了解我的类的属性的属性是否已更改
【发布时间】:2014-06-17 10:58:28
【问题描述】:

我有以下课程

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;

【问题讨论】:

  • 听众?或者你认为它类似于 observable?
  • 是的,量子力学是一种可能!说真的,只是观察呢?
  • 监听器/事件模式在这里可以正常工作吗?
  • 你想达到什么目的?您可以使用从 A 到 B 的引用或类似事件总线的东西(例如 Google Guava),但在我看来,观察者最适合您的示例
  • 为什么这个奇怪的问题有三票赞成?!

标签: java design-patterns


【解决方案1】:

将您的类 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 类,但接口是最好的方法。

【讨论】:

    【解决方案2】:

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

    这种模式在客户端使用起来有点困难,但它确实意味着 B 类会自动得到通知,因为你只能通过调用 set 方法来更改 B 中的 A 的一部分。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多