Зачем нужен паттерн Наблюдатель?

Я прочитал книгу о паттерне наблюдателя. Это дает следующий пример:

Класс clock, с методом time()

Класс message, от которого наследуются 3 класса: Fax, Mail, Memo.

Приложение хочет отправить сообщение, когда наступит 12 часов утра.

Книга рекомендует паттерн наблюдателя. В нем говорится, что если мы добавим новый класс: VideoMsg, который расширяет сообщение, это повлияет на реализацию класса Clock. Но я не понимал почему. Класс Clock будет содержать коллекцию объекта message, и если мы добавим новый наследуемый класс, он не изменит класс часов.

Буду признателен, если кто-нибудь объяснит приведенный выше пример или даст лучший пример.


person Adam Sh    schedule 26.04.2012    source источник
comment
Вы искали здесь шаблон наблюдателя? stackoverflow.com/search?q=observer+pattern   -  person albertjan    schedule 26.04.2012
comment
проверьте любой из этих stackoverflow.com/questions/1249517/ ИЛИ codeproject.com/Articles/6384/Observer-Pattern-in-NET   -  person userGS    schedule 26.04.2012
comment
@userGS: Я понял, как реализовать наблюдатель pattren. Я не понимал, зачем нам это нужно.   -  person Adam Sh    schedule 26.04.2012
comment
для достижения функциональности издатель-подписчик мы используем шаблон наблюдателя   -  person Balaswamy Vaddeman    schedule 26.04.2012
comment
так ваш вопрос о том, что не понял, почему новый класс повлияет на реализацию Clock, или даже не понял цель Observer?   -  person Adrian Shum    schedule 26.04.2012
comment
почему это помечено как c #, так и java? в С # у вас есть события, нет необходимости в шаблоне наблюдателя   -  person    schedule 26.04.2012
comment
@alegen: как я понял, в c # у меня интерфейс IObservable   -  person Adam Sh    schedule 26.04.2012
comment
@AdrianShum: Я не понял цель Observe в этом случае, и я буду счастлив получить пример, который объяснит мне, где я получил преимущества использования наблюдателя pattren   -  person Adam Sh    schedule 26.04.2012
comment
@AdamSh я не говорил, что шаблон не может быть реализован; Я сказал, что .net имеет события и специально для этого созданы. это в основном та же концепция, но с точки зрения кода проще реализовать логику   -  person    schedule 26.04.2012


Ответы (5)


Простыми словами, чтобы вы поняли шаблон наблюдателя

если 1000 человек подписаны на ежедневную новостную газету.

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

Точно так же класс One будет отправлять информацию своим наблюдателям всякий раз, когда получает новую информацию.

person Balaswamy Vaddeman    schedule 26.04.2012

Поскольку новый новый класс, который является наблюдателем, будет вызывать только метод subscribe в экземпляре часов, а когда часы достигнут 12 утра, он вызовет метод notifyObservers, который будет перебирать подписчиков и вызывать их метод notify, сообщая им, что Сейчас 12 утра.

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

person Darth Plagueis    schedule 26.04.2012

Суть такова:

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

Объедините паттерн Observer с наследованием и полиморфизмом объектно-ориентированной теории, и вы увидите, насколько ГИБКИМ будет ваш код.

person Lyn    schedule 26.04.2012

Помимо недостающих деталей, я бы предположил, что «сообщения» наблюдают за объектами часов, чтобы вовремя запускать «действия». В зависимости от «как» (наблюдения)? это реализовано, это может означать, что необходимо изменить часы. Паттерн наблюдателя - это паттерн «мы зовем вас - не звоните нам». Это в основном предотвращает дорогостоящее зацикливание при ожидании.

person hburde    schedule 26.04.2012

Честно говоря, сложно дать ответ, так как в примере не так много деталей реализации.

В шаблоне Observer «наблюдаемый объект» (Subject) будет содержать ссылку на Observers, а Subject обычно отвечает за создание «сообщения» для отправки наблюдателям. Это означает, что если вам нужно уведомить наблюдателей о новом сообщении, реализацию Subject необходимо изменить, поскольку она должна знать, как создается новое сообщение.

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

person Adrian Shum    schedule 26.04.2012