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

问题描述 投票:1回答:2

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

因此,如果发布了动漫剧集,则通知另一位观察者以更新此特定动漫的剧集状态。

并且有效。

我的问题:

我试图理解观察者模式,我想知道是否必须给观察者的构造函数以Observable作为参数。

因为我在某些教程和站点中已经看到它,因此我有点困惑。

最诚挚的问候

你的乔治

java design-patterns observable observer-pattern
2个回答
0
投票

它不一定需要了解创建时的可观察性。

您可以像这样实现它(一个简单的示例,当然并不完美)

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;

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


0
投票

不一定。通常,您这样做是为了将观察者注册为可观察者。但是您也可以从外部进行此操作。

使用构造函数:

  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);
© www.soinside.com 2019 - 2024. All rights reserved.