Наблюдатель (Observer)¶
Observer позволяет издателю уведомлять подписчиков об изменениях, не зная деталей их реакции.
Опора на ООП¶
Observer опирается на интерфейсы и полиморфизм: издатель работает с общим контрактом подписчика, а конкретные реакции распределены по разным наблюдателям. Инкапсуляция при этом удерживает слабую связанность между сторонами.
Что показывает пример на 1С¶
DataProcessors.EventManagerхранит подписчиков вMap, умеетSubscribe(),Unsubscribe()иNotifySubscribers(Data).DataProcessors.Subjectвыполняет свою логику и затем вызываетEventManager.NotifySubscribers("Success").Documents.SalesOrderиCatalogs.Partnerреализуют методUpdate(Data)и могут выступать подписчиками.
Пример¶
Var Listeners;
Procedure Subscribe(Subscriber) Export
Listeners.Insert(Subscriber, True);
EndProcedure
Procedure Unsubscribe(Subscriber) Export
Listeners.Delete(Subscriber);
EndProcedure
Procedure NotifySubscrbers(Data) Export
For Each Listener In Listeners Do
Listener.Update(Data);
EndDo;
EndProcedure
Listeners = New Map;
Где полезен в 1С¶
- для реакций на доменные события;
- для отделения публикации события от действий подписчиков;
- для уведомлений, синхронизации витрин, логирования и вспомогательных процессов.
Когда паттерн лишний¶
- если получатель всегда один и известен заранее;
- если цепочка подписчиков скрывает важную бизнес-логику;
- если нет дисциплины в управлении подписками и жизненным циклом объектов.