Шаблон наблюдателя с несколькими предметами - PullRequest
0 голосов
/ 28 июня 2019

Как вы разрабатываете код так, чтобы у вас был шаблон наблюдателя с несколькими предметами и вы хотите знать, что происходит?

Очевидное решение -

interface SubjectOneObserver {
  void update(SomeStateModel m);
}

interface SubjectTwoObserver {
  void update(SomeStateModelTwo m2);
}

Тогда какой-то конкретный

class Concrete implements SubjectOneObserver, SubjectTwoObserver {...}

Не очень хорошо, будет создано много интерфейсов.Каков наилучший подход?

1 Ответ

1 голос
/ 28 июня 2019

Я бы использовал существующие интерфейсы или универсальные интерфейсы в качестве анонимного класса (или, лучше, лямбда-выражения) вместо того, чтобы создавать множество интерфейсов и реализовывать их непосредственно в классе.

Java (8+) уже имеет интерфейс дляВаш вариант использования называется Consumer: https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

class Observable {
   // there are better ways than using a list, but it shows how the subject would work
   private List<Consumer<SomeStateModel>> subjectOne = new ArrayList();
   private List<Consumer<SubjectTwoObserver>> subjectTwo = new ArrayList();

   subscribeOne(Consumer<SomeStateModel> observer) {
      subjectOne.add(observer);
   }

   subscribeTwo(Consumer<SubjectTwoObserver> observer) {
      subjectTwo.add(observer);
   }

   triggerOne(SomeStateModelTwo state) {
      subjectOne.forEach(c -> c.accept(state));
   }

   ....
}

class Concrete {
   Concrete(Observable instanceToObserve) { // i put that in the constructor, no idea were you get your instance from
       instanceToObserve.subscribeOne(state -> {
           // this will get called when subjectOne is triggered
       })
       instanceToObserve.subscribeTwo(state -> {
           // this will get called when subjectTwo is triggered
       })
   }
}

Ваш вопрос очень широкий и неясно, чего вы на самом деле пытаетесь достичь.Особенно то, как вы подписываете наблюдателя на эту тему.Если вы используете множество наблюдаемых и предметов, то, возможно, вам следует использовать библиотеку, в которой уже есть все функции, такие как RxJava: https://github.com/ReactiveX/RxJava

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...