НЕ МОЛЧИ!!!    Сделай что-нибудь, чтобы остановить войну России в Украине.
...бойтесь людей равнодушных - именно с их молчаливого согласия происходят все самые ужасные преступления на свете.   ("Репортаж с петлёй на шее")

Шаблон проектирования Facade (Фасад)

Рассматривается структурный шаблон проектирования Facade (Фасад), его описание и реализация.

Содержание

  • Применение
  • Реализация
  • Итоги

Применение

Сегодня рассмотрим структурный шаблон проектирования Facade (Фасад). Шаблон используется для упрощения взаимодействия с некой сложной программной подсистемой. Рассмотрим, как же происходит это упрощение? Для этого создается объект, с которым и взаимодействуют клиенты, а уже этот объект берет на себя труд транслировать клиентские запросы к соответствующим объектам подсистемы. Другими словами создается фасад (удобный и красивый 🙂 ) программной подсистемы. Пытливый буквоед может поинтересоваться, а в чем же упрощение? А дело в том, что вы сами строите удобный и внятный интерфейс фасада, а не используете существующий. Кроме того, фасад может брать на себя лишь часть клиентских запросов. Никто не запрещает создать несколько фасадов, каждый из которых взаимодействует с логически законченной частью подсистемы. А главное, фасад не запрещает прямой доступ к объектам подсистемы, он только предлагает себя, как альтернативу существующему взаимодействию. Facade также можно использовать в качестве интерфейса более высокого уровня, которым можно заменить набор внешних методов различных объектов подсистемы нижнего уровня. Кто разрабатывал достаточно сложное ПО или пользовался таковым, думаю согласятся, что затраты на создание Фасада при тщательном проектировании вполне окупаются упрощением взаимосвязей ПО.
Схематично шаблон Facade выглядит примерно так.

Использование шаблона Фасад

Как видите клиент может взаимодействовать со сложной системой как напрямую, так и через Фасад.

Реализация

Надеюсь, смысл использования паттерна ясен. Теперь продемонстрируем применение Facade конкретнее. Предположим, клиент взаимодействует с системой, которая возвращает почтовые адреса и геокоординаты домов. Назовем ее House. Следуя принципу единственной ответственности в House реализованы следующие методы.

Методы системы House.
getMailCode(); getLongitude();
getCity(); getLatitude();
getStreet(); setLongitude(longitude);
getHouse(); setLatitude(latitude);
setMailCode(code);
setCity(city);
setStreet(str);
setHouse(house);
//другие методы системы

Естественно приведена лишь часть воображаемого объемного интерфейса.
Для упрощения взаимодействия с объектом House вполне можно заменить приведенные методы следующими объекта Facade.

Методы объекта Facade
getAddress();
setAddress(code, city, street, house);
getGeo();
setGeo(longitude, latitude);

Здесь метод getAddress() взаимодействует с 4-мя первыми методами левой колонки методов House, аналогично метод setAddress заменяет 4 последние метода левой колонки House. Тоже самое проделаем с правой колонкой методов House и теперь имеем.

В результате наш клиент вместо десятка мелких методов может использовать лишь четыре.

Итоги

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