Как бы вы описали шаблон Observer на языке начинающих? - PullRequest
14 голосов
/ 20 апреля 2009

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

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

Как бы вы описали этот шаблон Observer и его использование в C # для новичка? Для примера, пожалуйста, держите код очень простым, чтобы я мог понять цель больше, чем сложные фрагменты кода. Я пытаюсь использовать его эффективно с некоторыми простыми манипуляциями со строками текстовых полей и использованием делегатов для моего назначения, так что указатель поможет!

Ответы [ 16 ]

0 голосов
/ 02 мая 2010

Очень мало примеров в реальном времени:

  1. Газета / Журнал / Список рассылки Подписка или любая подписка в целом
  2. Пометка коллег в MS Office Коммуникатор
  3. Twitter
0 голосов
/ 21 апреля 2009

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

В этом шаблоне у вас есть два класса, два объекта: издатель и обозреватель. Publisher - это класс, который на самом деле выполняет некоторую работу, затем он часто вызывает методы у любых наблюдателей, чтобы сообщить им об этом. Он знает, какие классы вызывать, потому что хранит список наблюдателей, которые подписались.

Так что ваш издатель может выглядеть примерно так:

class Publisher
{
    List<Observer> observers = new List<Observer>();

public Add(Observer o)
{
    observers.Add(o);
}

private AlertObservers()
{
    foreach(Observer o in observers)
    {
        o.Alert();
    }
}

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

class Observer
{
    public Observer(Publisher pub)
    {
        pub.Add(this);
    }

    public Alert()
    {
        System.Console.WriteLine("Oh no, stuff is happening!");
    }
}

Это довольно скромное представление о том, как это работает. Теперь, почему это ценно? Выглядит довольно хорошо, да? Одна из причин этого заключается в том, что я не использую интерфейс, который позволил бы мне настроить многие классы с функциональностью Observer, и Publisher никогда не нужно знать о них больше ничего, кроме того, что они могут получать вызов Alert (). Также обратите внимание, что Publisher будет пытаться вызвать Alert для любого и всех Наблюдателей, которые у него есть, даже если у него их нет.

Теперь в мире C # язык имеет встроенную версию этого паттерна через свои объекты Event. События очень мощные и используют делегатов, что является способом передачи метода в качестве параметра при вызове другого метода. Они допускают некоторое серьезное разделение, но я бы оставил это для нового вопроса.

0 голосов
/ 21 апреля 2009

В одном предложении:

Объект (субъект) позволяет другим объектам (наблюдателям) подписываться на уведомления.

Практический пример:

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

Вы можете создать класс PluginSubject и поместить в него метод с именем NotifyOrderCreated. Всякий раз, когда на экране заказа создается новый заказ, он вызывает PluginSubject.NotifyOrderCreated.

Когда это происходит, PluginSubject получает список PluginObservers и вызывает PluginObserver.Notify для каждого из них, передавая сообщение, описывающее событие.

Это обеспечивает действительно полезную функциональность.

гораздо больше, чем вы хотите знать:

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

Затем вы можете позволить пользователям подписывать свои собственные сборки (вам нужно где-то сохранить список имен сборок, а затем пройтись по нему), и bam, у вас есть расширяемость!

0 голосов
/ 20 апреля 2009

Наблюдатель (Опубликовать / Подписаться)

Когда объект меняет состояние, он уведомляет другие объекты, которые зарегистрировали свой интерес во время выполнения. Уведомляющий объект (издатель) отправляет событие (публикацию) всем своим наблюдателям (подписчикам).

0 голосов
/ 20 апреля 2009

Представьте, что у вас есть объект, поведение (или состояние) которого вы хотите наблюдать. Например, когда поле A достигает значения 10, вы хотите получать информацию об этом событии без фактической привязки к деталям реализации этого сложного объекта, который вы хотите наблюдать. Вы определяете интерфейс, называете его Observable и позволяете своей цели реализовать этот интерфейс, он должен иметь как минимум два метода для регистрации и отмены регистрации Observer, который, в свою очередь, является объектом, который будет вызван Observer, когда поле A достигнет 10. Ваш Observer просто вызывает Observable для регистрации (и отмены регистрации, когда закончите). Обычно наблюдаемые ведут список наблюдателей и уведомляют их сразу или по вашему усмотрению. Это также можно сделать синхронно или асинхронно, решать только вам. Это очень упрощенное объяснение без написания кода. Как только вы поймете это, реализации могут отличаться в деталях, чтобы соответствовать вашим конкретным потребностям.

0 голосов
/ 20 апреля 2009

Проще говоря, есть два компонента: Наблюдатель и Наблюдаемый.

Внешне Наблюдателю нужен способ добавить (зарегистрироваться) и удалить Обозревателя.
Внутренне Наблюдателю необходим список зарегистрированных Наблюдателей.

Наблюдателю нужен открытый метод, такой как Notify () или Notify (params).

Каждый раз, когда с Наблюдаемым происходит конкретная вещь, она будет проходить по списку и вызывать Notify () для каждого зарегистрированного наблюдателя.

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

В Model-View-Controller наблюдаемый обычно является объектом-сущностью - чем-то, что содержит данные. Контролер является Наблюдателем. Он отслеживает изменения в модели и сообщает представлению обновить себя, если оно заинтересовано в изменении.

Слушатели событий Java - это реальная реализация этого шаблона.

...