Я пытаюсь изучить шаблон проектирования Observer и начал смотреть серию, принадлежащую codewithmosh, под названием «Серия Ultimate Design Pattern».
на уроке, посвящённом Observer, он говорит:

Это то, что мы называем стилем общения «Push». поскольку «Субъект» передает изменения наблюдателям.
Однако у этого подхода есть проблема. Завтра мы могли бы представить новый тип ConcreteObserver, и этому наблюдателю может понадобиться другой набор ценностей. Поэтому нам придется вернуться сюда и измениться. интерфейс наблюдателя; возможно, нам придется ввести новый параметр или возможно, нам придется изменить объект, который здесь передается. мы должны ввести новые поля в этом классе.
Так что этот подход не очень гибкий, поскольку Субъект делает предположения об этих наблюдатели; предполагается, что этим наблюдателям нужны эти значения, когда происходит изменение. А что, если каждому наблюдателю понадобится свой набор ценности? Вот тогда мы и сможем использовать стиль общения «Притягивание».
Я просто пытаюсь понять, почему стиль Push не является гибким. мой вопрос касается этого предложения:
Итак, нам придется вернуться сюда и изменить интерфейс Observer; мы можем придется ввести новый параметр, или, возможно, придется изменить объект это здесь передано. нам нужно ввести новые области в этом класс.
это мой ConcreteSubject:
публичный класс ConcreteSubject расширяет тему { частное целое значение; частное строковое значение2; общественный недействительный setValue (целое значение) { это.значение = значение; notifyObservers (значение, ноль); } public void setValue2 (String value2) { это.значение2 = значение2; notifyObservers (ноль, значение2); } } У меня также есть 2 ConcreteObserver, но ConcreteObserver2 не хочет получать уведомления о первом поле «value» в ConcreteSubject. Я попытался ввести новый параметр следующим образом:
публичный интерфейс Observer { void update(значение T, значение U2); } а это другие мои занятия:
public class subject { // Observable частные наблюдатели List = new ArrayList(); public void addObserver (наблюдатель-наблюдатель) { наблюдатели.add(наблюдатель); } public void removeObserver (наблюдатель-наблюдатель) { наблюдатели.удалить(наблюдатель); } public void notifyObservers (значение T, значение U2) { for (Наблюдатель-наблюдатель: наблюдатели) наблюдатель.обновление(значение, значение2); } } --
публичный класс ConcreteObserver1 реализует Observer { @Override public void update(T value, U value2) { если (значение!= ноль) System.out.println("ConcreteObserver1 получил уведомление. " + value); если (значение2!= ноль) System.out.println("ConcreteObserver1 получил уведомление. " + value2); } } --
публичный класс ConcreteObserver2 реализует Observer { @Override public void update(T value, U value2) { если (значение2!= ноль) System.out.println("ConcreteObserver2 получил уведомление. value2: " + value2); } } Итак, это было первое решение, о котором говорил учитель, и оно вводило новый параметр, и это была моя реализация этого решения, но я не могу понять второе решение. (жирный текст)
Что он означает, когда он говорит: «Возможно, нам придется изменить переданный здесь объект»? Я думаю, что это бесполезно, потому что тип моего параметра в интерфейсе является общим, и я могу передать все, что захочу. также я не могу понять: «нам нужно ввести новые поля в этом классе». в какой класс? почему? как это может помочь ConcreteObserver2 получать уведомления о конкретном поле?