构建 Observer 和 Observable class

Building Oberver and Observable class

我没有使用内置 class Observable and Observer 我正在尝试自己构建它。

我从文档中得出:

public class Observable{
   private Set<Observer> observingMe=null;
   private boolean amIchanged;

   public void notifyObservers(Object args){
        for(Observer o:observingMe){
            o.update(args);
        }
   }

   public void addObserver(Observer e){
    observingMe.add(e);
   }

}

public class Price implements Observable{
    private int price;
    public void setPrice(int newPrice){
        price=newPrice;
        notifyObservers(price);
    }
}
public interface Observer{
    public void update(Object args);
}

这是(简而言之)Observable 的正确实现吗?在构建 Observable class 时我还需要考虑什么? 有没有办法自动检测 Observable 实例中的任何变化或继承的 class 必须显式调用 notifyObservers?

请不要介意语法或小错误

在你的通知方法中,考虑观察者在调用更新时抛出异常的情况。如果您不处理它,它将阻止其他观察者收到通知。此外,您可能希望在单独的线程中通知每个观察者,因为其中一个观察者可能需要很长时间才能对事件做出反应,从而防止其他人提前得到通知。

此外,您从不使用布尔值 amIChangeed,并且在没有 getter 的情况下将其保密。否则,你已经实现了基本原则。

一开始有几点不对:

  • observingMe 使用时会抛出 NullPointerException,因为它没有被初始化。
  • 您不能将 implementsclass 一起使用。你应该使用 extends 因为 Observable 是 class.
  • amIchanged 从未使用过。你可以删除它。

关于自动观察者通知:您可能希望在建议后连接一个 AOP,在每次 set...(...) 方法调用后触发。 (检查确切的切入点语法)。

但这值得吗?为确保方法 notifyObservers() 被调用,您可能更喜欢几个测试方法。

您也可以考虑使用 removeObserver(Observer e) 方法。