Глава 18. Базовые типовые решения 485
внешней системы все в порядке, использование шлюза позволяет сделать первый шаг в
направлении реализации фиктивной службы.
Не менее важным преимуществом шлюза является возможность легко переключаться
между источниками данных. Дня перехода к другому источнику достаточно просто изме-
нить класс шлюза — оставшейся части системы это не коснется. Таким образом, шлюз
представляет собой простое и мощное средство инкапсуляции изменений. Иногда по-
требность в наличии подобной степени гибкости, а следовательно, и в реализации шлюза
кажется спорной. Тем не менее, даже если вы не собираетесь менять источник данных в
обозримом будущем, вы несомненно выиграете от простоты написания и тестирования
кода, которую обеспечивает данное типовое решение.
В качестве альтернативного варианта изолирования приложений от внешних источ-
ников может применяться преобразователь (Mapper, 489). Однако он имеет более слож-
ную структуру, нежели шлюз, а потому я предпочитаю использовать именно последний.
Некоторое время меня одолевали сомнения относительно того, стоит ли выделять
данную схему в самостоятельное типовое решение, противоположное существующим ти-
повым решениям интерфейс (Facade), адаптер (Adapter) и медиатор (Mediator) [20]. В конце
концов я решил описать шлюз как отдельное типовое решение, поскольку, на мой
взгляд, оно обладает рядом существенных отличий.
• Типовое решение интерфейс также упрощает работу с интерфейсом API, однако
оно создается самим разработчиком внешней службы и предназначено для общего
употребления. В свою очередь, шлюз разрабатывается клиентом для использова
ния конкретным приложением. Кроме того, интерфейс доступа, предоставляемый
объектом интерфейса, всегда отличается от интерфейса стоящего за ним объекта, в
то время как интерфейс шлюза может представлять собой точную копию инкапсу
лируемого интерфейса (для тестирования или замены источника данных сурро
гатным объектом).
• Типовое решение адаптер изменяет интерфейс некоторого объекта для достиже
ния соответствия с интерфейсом другого объекта. В отличие от него, интерфейс
шлюза не нужно подстраивать под какой-либо существующий интерфейс. Вообще
говоря, типовое решение адаптер можно применить, чтобы отобразить реализа
цию некоторого объекта на интерфейс шлюза. В этом случае объект адаптера будет
представлять собой составную часть реализации шлюза.
• Типовое решение медиатор разделяет множество объектов так, чтобы они не знали
о существовании друг друга, но были осведомлены о наличии объекта медиатора.
Шлюз разделяет только два объекта, причем источник данных не знает о сущест
вовании шлюза.
Пример: создание шлюза к службе отправки сообщений (Java)
Обсуждая концепцию шлюза с моим коллегой Майком Реттигом (Mike Rettig), я уз-
нал, как он использовал данное типовое решение для обработки доступа к внешним ин-
терфейсам в приложениях EAJ (Enterprise Application Integration — интеграция корпора-
тивных систем). Мы решили, что опыт Майка может послужить прекрасной основой для
рассмотрения примера использования шлюза.