Фасад (Facade)

Facade (Фасад) относиться к классу структурных паттернов. Представляет собой унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Паттерн фасад определяет интерфейс более высокого уровня, который упрощает использование подсистем.
Разбиение на подсистемы сложной системы позволяет упростить процесс проектирования, а также помогает максимально снизить зависимости одной подсистемы от другой. Однако это приводит к тому, что использовать такие подсистемы вместе становиться довольно сложно. Один из способов решения этой проблемы является ввод паттерна фасад.
Это один из тех паттернов, у которого нет четкой реализации, так как она зависит от конкретной системы. В общем случае нам надо выполнить такое преобразование:

В сером прямоугольнике находятся наши подсистемы, которые имеют некоторые зависимости между собой (могут и не иметь). Тремя верхними блоками обозначаются три участка клиентского кода, в которых он взаимодействует с этой подсистемой. Наша задача, сделать простой, единый интерфейс, через которого было бы достаточно для взаимодействия с подсистемами в рамках поставленной задачи, т.е. нам не нужно делать универсальный интерфейс, на все случаи жизни, так как это в большинстве случаев излишне и ведет к усложнению взаимодействия, увеличению времени разработки.
Ниже приведен набросок одной из реализаций:
[php]
/**
* SystemA
*/
class Bank
{
public function OpenTransaction() {}
public function CloseTransaction() {}
public function transferMoney($amount) {}
}
/**
* SystemB
*/
class Client
{
public function OpenTransaction() {}
public function CloseTransaction() {}
public function transferMoney($amount) {}
}
/**
* SystemC
*/
class Log
{
public function logTransaction() {}
}
class Facade
{
public function transfer($amount)
{
$Bank = new Bank();
$Client = new Client();
$Log = new Log();
$Bank -> OpenTransaction();
$Client -> OpenTransaction();
$Log -> logTransaction(‘Transaction open’);
$Bank -> transferMoney(-$amount);
$Log -> logTransaction(‘Transfer money from bank’);
$Client -> transferMoney($amount);
$Log -> logTransaction(‘Transfer money to client’);
$Bank -> CloseTransaction();
$Client -> CloseTransaction();
$Log -> logTransaction(‘Transaction close’);
}
}
// Client code
$Transfer = new Facade();
$Transfer -> transfer(1000);
[/php]
В этой реализации создание и инициализация подсистем жестко зашита в код, этого можно избежать введя паттерн фабрика или используя параметризованный конструктор для фасада.

Результат

Используйте этот паттерн, если вы хотите:

  • Предоставить простой интерфейс к сложной подсистеме
  • Отделить систему от клиентов и от других систем
  • Разделить подсистему на независимые слои (точка входа каждого слоя — фасад)
  • Повысить переносимость

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

Материал взят с источника

Добавить комментарий