нужен ли конструктор наблюдателя как наблюдаемый параметр? - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь внедрить Observer в мое аниме GUI.

Таким образом, если выпущен эпизод Аниме, уведомите другого Наблюдателя об обновлении состояния эпизода этого указанного c аниме.

И это работает.

Мой вопрос:

Я пытаюсь понять Шаблон наблюдателя, и я хотел бы знать, должен ли я дать Конструктору Наблюдателя Наблюдаемый в качестве параметра.

Поскольку я видел это в некоторых уроках и на сайтах, поэтому я немного запутался.

С наилучшими пожеланиями

Ваш Джордж

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Не обязательно. Вы обычно делаете это, чтобы зарегистрировать обервера для наблюдаемого. Но вы можете сделать это и снаружи. Преимущество использования подхода с конструктором заключается в том, что вы не пропустите регистрацию наблюдателя во время кодирования, в противном случае оба подхода хороши.

С конструктором:

  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);
0 голосов
/ 09 января 2020

Не обязательно знать о наблюдаемом при создании.

Вы можете реализовать это так (простой пример, конечно, не идеальный)

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;

В заключение, обычно реализация этого шаблона означает, что вам нужно реализовать способ добавления наблюдателей к наблюдаемым и уведомления их, когда это необходимо.

...