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

时间:2020-01-09 08:45:18

标签: java design-patterns observable observer-pattern

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

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

它有效。

我的问题:

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

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

最好的问候

你的乔治

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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);