Шаблон проектирования Facade

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

 

Краткое описание

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

Поэтому, имеет смысл предоставить клиентам удобный интерфейс, который будет изолировать классы компилятора от клиента. В систему просто включается дополнительный класс ProgramRunner. Он определяет унифицированный интерфейс ко всем возможностям компилятора. В этом случае, класс ProgramRunner будет выступать в роли фасада — предлагать более простой интерфейс к достаточно сложной подсистеме.

Клиенты общаются с подсистемой, посылая запросы фасаду. Он переадресует их подходящим объектам внутри подсистемы.

До применения паттерна:

После применения паттерна:

 

Пример «из жизни»

Паттерн Facade используется в таких популярных системах, как LWP и DBI.

LWP

Для того, чтобы получить простой файл с сайта, надо установить соединение с этим ресурсом, создать корректный http-запрос, получить http-ответ, разобрать ответ и извлечь из него нужные данные. Если требуется обработать cookies, отправить данные из html-формы, количество работы становится еще больше. Для выполнения всей этой работы требуется подключить множество классов и оперировать множеством объектов. Если в рамках программы требуется реализовать всего лишь разовое подключение к сайту, это как минимум не удобно и не эффективно.

Модуль LWP представляет собой фасад ко множеству объектов, которые реализуют всю работу по подключению к нужному ресурсу, отправке запросов и получению ответов.

Можно упростить работу еще больше — LWP::Simple представляет собой фасад для LWP::UserAgent и др.

Пример:

Кроме того, LWP является фасадом для использования различных протоколов HTTP, HTTPS, FTP, NNTP, и разработчику не приходится тратить время на подключение различных библиотек и изучение особенностей работы с ними.

DBI

Архитектура DBI:

DBI обеспечивает простой интерфейс доступа к различным серверам баз данных. При этом не нужно беспокоиться о реализации подключения к базе данных, реализации протоколов взаимодействия и формате данных.

Можно даже изменить тип базы данных и ограничиться внесением минимальных изменений в свой код, или даже вообще обойтись без них.

Class::Facade

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

Синтаксис Class::Facade:

Использование Class::Facade :

 

Очень простой пример реализации паттерна Facade

Frequest.pm :

Fresponse.pm :

Фасад — Facade.pm :

Вместо вызова нескольких модулей, вызываем только модуль Facade.pm.

facade.pl :

 

Полезные ссылки по теме «шаблон проектирования Facade»

theperlreview.com: The Facade Design Pattern

theperlreview.com: The Facade Design Pattern (PDF)

houseabsolute.com: Facade example

perldesignpatterns.com: Facade Pattern

search.cpan.org: DBI

search.cpan.org: Class::Facade