观察者的构造函数需要 Observable 作为参数吗?

does the Constructor of an Observer needs the Observable as parameter?

我正在尝试为我的动画 GUI 实现一个 Observer。

因此,如果发布了动漫剧集,则通知其他观察者更新该特定动漫剧集的状态。

而且有效。

我的问题:

我正在尝试理解观察者模式,我想知道是否必须为观察者的构造函数提供 Observable 作为参数。

因为我在一些教程和网站上看到过,所以我有点困惑。

此致

你的乔治

创建时不一定需要知道 observable。

你可以这样实现(简单的例子,当然不完美)

class MyObservable {

    private ArrayList<MyObserver> observersList = new ArrayList<>();

    public void addObserver(MyObserver observer) {
        observersList.add(observer)
        // OR observer.addObservable(this) , but it is kinda strange one
    }

    public void onAnimeReleased() {
        // Some other logic, release Anime and etc...
        notify();
    } 

    private void notify() {
        observersList.forEach((obs) -> obs.notify());
    }
}

请注意,您也可以持有对不在集合中的观察者的引用。

private MyObserver animeObserver;

总而言之,通常实现此模式意味着您需要实现一种将观察者添加到可观察对象并在需要时通知他们的方法。

不一定。您通常这样做是为了将观察者注册到可观察对象。 但是你也可以从外面做到这一点。 使用 with constructor 方法的优点是你不会在编码时错过注册观察者,否则两种方法都可以。

构造函数:

  public MyObserver(MyObservable myObservable) {
      myObservable.register(this);
  }

  Main code: 
  MyObservable observable1 = new MyObservable();

        Observer obj1 = new MyObserver(observable1 );
        Observer obj2 = new MyObserver(observable1 );
        Observer obj3 = new MyObserver(observable1 );

没有构造函数的类似这样的东西:

        Observer obj1 = new MyObserver();
        Observer obj2 = new MyObserver();
        Observer obj3 = new MyObserver();

        //register observers to the subject
        observable1.register(obj1);
        observable1.register(obj2);
        observable1.register(obj3);