Фасад — это структурный паттерн, который предоставляет простой (но урезанный) интерфейс к сложной системе объектов, библиотеке или фреймворку.
Кроме того, что Фасад позволяет снизить общую сложность программы, он также помогает вынести код, зависимый от внешней системы в единственное место.
Сложность:
Популярность:
Применимость: Паттерн часто встречается в клиентских приложениях, написанных на TypeScript, которые используют классы-фасады для упрощения работы со сложными библиотеки или API.
Признаки применения паттерна: Фасад угадывается в классе, который имеет простой интерфейс, но делегирует основную часть работы другим классам. Чаще всего, фасады сами следят за жизненным циклом объектов сложной системы.
Концептуальный пример
Этот пример показывает структуру паттерна Фасад , а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.
index.ts: Пример структуры паттерна
/**
* Класс Фасада предоставляет простой интерфейс для сложной логики одной или
* нескольких подсистем. Фасад делегирует запросы клиентов соответствующим
* объектам внутри подсистемы. Фасад также отвечает за управление их жизненным
* циклом. Все это защищает клиента от нежелательной сложности подсистемы.
*/
class Facade {
protected subsystem1: Subsystem1;
protected subsystem2: Subsystem2;
/**
* В зависимости от потребностей вашего приложения вы можете предоставить
* Фасаду существующие объекты подсистемы или заставить Фасад создать их
* самостоятельно.
*/
constructor(subsystem1?: Subsystem1, subsystem2?: Subsystem2) {
this.subsystem1 = subsystem1 || new Subsystem1();
this.subsystem2 = subsystem2 || new Subsystem2();
}
/**
* Методы Фасада удобны для быстрого доступа к сложной функциональности
* подсистем. Однако клиенты получают только часть возможностей подсистемы.
*/
public operation(): string {
let result = 'Facade initializes subsystems:\n';
result += this.subsystem1.operation1();
result += this.subsystem2.operation1();
result += 'Facade orders subsystems to perform the action:\n';
result += this.subsystem1.operationN();
result += this.subsystem2.operationZ();
return result;
}
}
/**
* Подсистема может принимать запросы либо от фасада, либо от клиента напрямую.
* В любом случае, для Подсистемы Фасад – это еще один клиент, и он не является
* частью Подсистемы.
*/
class Subsystem1 {
public operation1(): string {
return 'Subsystem1: Ready!\n';
}
// ...
public operationN(): string {
return 'Subsystem1: Go!\n';
}
}
/**
* Некоторые фасады могут работать с разными подсистемами одновременно.
*/
class Subsystem2 {
public operation1(): string {
return 'Subsystem2: Get ready!\n';
}
// ...
public operationZ(): string {
return 'Subsystem2: Fire!';
}
}
/**
* Клиентский код работает со сложными подсистемами через простой интерфейс,
* предоставляемый Фасадом. Когда фасад управляет жизненным циклом подсистемы,
* клиент может даже не знать о существовании подсистемы. Такой подход позволяет
* держать сложность под контролем.
*/
function clientCode(facade: Facade) {
// ...
console.log(facade.operation());
// ...
}
/**
* В клиентском коде могут быть уже созданы некоторые объекты подсистемы. В этом
* случае может оказаться целесообразным инициализировать Фасад с этими
* объектами вместо того, чтобы позволить Фасаду создавать новые экземпляры.
*/
const subsystem1 = new Subsystem1();
const subsystem2 = new Subsystem2();
const facade = new Facade(subsystem1, subsystem2);
clientCode(facade);
Output.txt: Результат выполнения
Facade initializes subsystems:
Subsystem1: Ready!
Subsystem2: Get ready!
Facade orders subsystems to perform the action:
Subsystem1: Go!
Subsystem2: Fire!
Фасад на других языках программирования