Программирование, Шаблоны проектирования

Шаблон «Фасад» (Facade pattern)

О том, что такое шаблон Фасад и как он может помочь в разработке.

User-Interface

Для начала определение:

Шаблон фасад (Facade) — структурный шаблон проектирования, позволяющий скрыть сложность системы путём сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

На первый взгляд — не самое просто определение. Но, если рассмотреть пример, все станет понятно.

Давайте представим процедуру оформления заказа на сайте (фото для примера).

pride_fitness_form

Перед вами сложная форма из нескольких шагов:

  • Таблица с выбранными товарами, их количество, цена.
  • Заполнение личных данных (имя, фамилия, телефон получателя).
  • Адрес и способ доставки.
  • Выбор способа оплаты.
  • … И другое.

С точки зрения кода, мы можем сказать, что процессом обработки заказа будет заниматься некоторая сложная система. Она будет состоять из компонентов (классов), которые реализуют необходимые для покупки задачи: списание денег со счета, очистка корзины, отправка уведомлений пользователю и службе доставки, т.д.

Как бы мог выглядеть клиентский код, который работал бы с системой обработки заказа:

Здесь мы по отдельности взаимодействуем с частями сложной системы (объектами разных классов): сохраняем информацию, историю покупок, отправляем уведомления, …

Этот пример выдуманный, но хорошо показывает проблему: клиентский код сильно связан с каждым из компонентов системы оформления заказа. Если со временем процесс оформления заказа будет меняться (например, изменится процедура хранения истории заказов, отправки уведомлений), будет сложно поддерживать клиентский код и отлавливать ошибки в нем.

Эту проблему легко решить, если определить одну точку взаимодействия — фасадный объект. Он обеспечивает общий интерфейс для работы с системой и сам  взаимодействует с её компонентами.

Как клиентский код может выглядеть теперь:

Все необходимые операции по обработке заказа, которые раньше выполнялись в клиентском коде теперь будут заключены в метод OrderFacade::process().

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

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


Вместо выводов

Часто программист разрабатывает сразу и систему, и клиентский код, который будет с ней работать. В это время он хорошо помнит архитектуру и все детали реализации компонентов системы. По этой причине кажется, что можно обойтись и без простого интерфейса. Думайте наперед и думайте о других разработчиках, которые коснутся этого кода. Делайте программу проще, используйте Facade там, где это уместно!

 

Поделитесь с друзьями или сохраните себе
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Напишите комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


пятнадцать + шестнадцать =