Посредник (Mediator)¶
Mediator централизует взаимодействие между объектами, чтобы они меньше зависели друг от друга напрямую.
Опора на ООП¶
Mediator в первую очередь опирается на инкапсуляцию: связи и координация выносятся из участников в отдельный объект. Если посредников несколько и они взаимозаменяемы, подключается и полиморфизм общего контракта.
Что показывает пример на 1С¶
- В
CommonForms.InitializeобработчикиUserOnChange,EmailOnChange,CountryOnChange,OK()иCancel()не вызывают друг друга напрямую, а только посылаютNotify(...). NotificationProcessing(EventName, Parameter, Source)- это обработчик стандартного события формы, который принимает уведомления и решает, как на них реагировать.Notify(...)в этом примере - не вспомогательная функция из проекта, а платформенный метод 1С.- Это типичный 1С-сценарий для сложной формы, где много элементов могут влиять друг на друга.
Пример¶
#Region FormEventHandlers
&AtClient
Procedure NotificationProcessing(EventName, Parameter, Source)
If Source <> ThisObject Then
Return;
EndIf;
If EventName = "UserChanged" Then
// Do something...
EndIf;
EndProcedure
#EndRegion
#Region FormHeaderItemsEventHandlers
&AtClient
Procedure UserOnChange(Item)
Notify("UserChanged", Item, ThisObject);
EndProcedure
#EndRegion
Особенность 1С¶
Для 1С здесь важен практический момент: паттерн Mediator во многих UI-сценариях уже реализован самой платформой.
Notify(...)отправляет уведомление;NotificationProcessing(...)как стандартный обработчик события формы централизованно его обрабатывает;- элементы формы не обязаны знать друг о друге напрямую.
То есть в управляемых формах 1С посредника часто не нужно проектировать с нуля отдельными классами. Обычно его уже дает платформа, и задача разработчика - использовать этот механизм по назначению:
- развязывать взаимозависимые элементы формы;
- не строить прямые вызовы между обработчиками;
- держать координацию в одном понятном месте.
Поэтому Mediator в 1С - это не только учебный паттерн из GOF, но и практический встроенный инструмент, который уже есть в платформе и которым нужно пользоваться осознанно.
Где полезен в 1С¶
- в формах с большим количеством взаимосвязанных реквизитов;
- в мастерах, редакторах и настройках с несколькими зависимыми областями;
- когда хаотичные прямые вызовы между элементами формы уже стали неуправляемыми.
Когда паттерн лишний¶
- если в форме только одна-две зависимости;
- если посредник превращается в огромный
NotificationProcessingна сотни строк; - если взаимодействие проще локализовать в одном обработчике.