Перейти к содержанию

Посредник (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 на сотни строк;
  • если взаимодействие проще локализовать в одном обработчике.

Источник примера