Шаблон проектирования наблюдателя - конкретные субъекты и наблюдатели - PullRequest
7 голосов
/ 29 июня 2011

Ссылки (Шаблоны проектирования GOF, Шаблоны проектирования «Сначала голова», http://www.dofactory.com/Patterns/PatternObserver.aspx), которые я прочитал относительно шаблона проектирования наблюдателя, предусматривают, что конкретный объект содержит ссылку на конкретного наблюдателя. Примерно так:

class ConcreteObserver : IObserver
{
    ConcreteSubject concreteSubjectInstance;
    //other code, etc.
} 

Теперь, если конкретный Субъект сам реализует интерфейс Субъекта (или является производным от некоторого абстрактного класса Субъекта), почему бы не сделать тип в ConcreteObserver таким же абстрактным / интерфейсным? * Т.е. 1006 *

class ConcreteObserver : IObserver
{
    ISubject concreteSubjectInstance;
    //other code, etc.
} 

Кроме того, почему бы просто не сделать это полем в (например) IObserver интерфейсе?

В конечном счете, учитывая, что сама модель, по-видимому, ослабляет связь Субъекта с его Наблюдателями, почему это не поощряется при соединении Наблюдателя с его субъектом?

enter image description here

Или это? Я основываю это только на примерах, которые я прочитал.

Ответы [ 4 ]

6 голосов
/ 29 июня 2011

Из вашей картинки ваш метод "update ()" не получает никакой информации о состоянии субъекта, поэтому, если наблюдателю нужна информация об этом состоянии (как обычно в шаблоне наблюдателя) затем он должен извлечь его из ConcreteSubject , вызвав метод «GetState ()» (отсутствует в ISubject).

Альтернативой этой схеме будет передача состояния (или ссылки на весь ConcreteSubject) в качестве параметра метода "update ()".

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

2 голосов
/ 29 июня 2011

То, что прочитанное вами определение гласит subject holds a reference to the concrete observer, не означает, что вы должны читать его буквально.

Пока субъект имеет ссылку / ссылку на наблюдателя, будь то конкретный или через интерфейс / класс, утверждение остается верным.

Очень часто можно видеть интерфейс на обеих сторонах IObserver и IObservable. Я думаю, что проблема, которую вы собираетесь найти, состоит в том, что, когда вы делаете абстрагирование субъекта, вам действительно придется очень постараться и найти как , чтобы сделать ваше состояние общим.

1 голос

Я постараюсь изложить свою точку зрения.

Почему бетон? Не вызовут ли они связь между Субъектом и Наблюдателем?

  • Основная задача шаблона наблюдателя - модель 1-N, а не N-N, и это достигается интерфейсом Observer.

  • Да, это вызывает связывание и предназначено, поэтому каждый конкретный наблюдатель получит именно то, что ему нужно, без избыточной «передачи контекста».

Сцепление это плохо, но Принцип> Разъединение.

Если доступ к конкретному предмету осуществляется через интерфейс субъекта, мы можем подписаться на другой предмет во время выполнения! Правильно?

  • Нет, для каждого конкретного наблюдателя update(), он должен делать только одну вещь . Принцип единой ответственности .
  • Что если кто-то захочет прослушать много событий? Это может быть сделано с помощью Composition , а не путем объединения всех вещей в один update().

Некоторые авторы книг / онлайн-ресурсов превращают update() в нечто вроде update(subject, context, varName, ...), тогда они предполагают, что наблюдателю понадобится, но

То, что понадобится Наблюдателю, не является заботой Субъекта, почему бы не взять это самостоятельно?

Соединение ConcreteObserver с ConcreteSubject, так что задание Субъекта просто отправляет уведомление, а не данные.

Тема: Привет всем, мой магазин открыт!
ObserverA: Хорошо, я думаю, что мне нужен этот iPhone.
ObserverB: Хорошо, я думаю, что мне нужен этот компьютер с Windows.
ObserverC: Мне нравятся как iPhone, так и Windows Computer, может, мне стоит спросить A, B о новостях.

1 голос
/ 03 апреля 2015

Бетон Observer и реализация Бетонного субъекта также имеют состояние. Когда меняется состояние субъекта, обновляется и состояние конкретного наблюдателя. Но иногда вам может понадобиться увидеть состояние субъекта, которого у вас нет, для этого вам лучше обратиться к субъекту. Другими словами, чтобы увидеть состояние конкретного субъекта.

...