Фасад (шаблон проектирования)
Шаблон Facade (Фасад) — Шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Описание
Проблема
Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Решение
Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна Устойчивый к изменениям (Protected Variations) с точки зрения защиты от изменений в реализации подсистемы.
Особенности применения
Шаблон применяется для установки некоторого рода политики по отношению к другой группе объектов. Если политика должна быть яркой и заметной, следует воспользоваться услугами шаблона Фасад. Если же необходимо обеспечить скрытность и аккуратность (прозрачность), более подходящим выбором является шаблон Заместитель (Proxy).
Примеры
JavaScript
/* Complex parts */
function SubSystem1() {
this.method1 = function() {
alert("вызван SubSystem1.method1");
};
}
function SubSystem2() {
this.method2 = function() {
alert("вызван SubSystem2.method2");
};
this.methodB = function() {
alert("вызван SubSystem2.methodB");
};
}
/* Facade */
function Facade() {
var s1 = new SubSystem1();
var s2 = new SubSystem2();
this.m1 = function() {
alert("вызван Facade.m1");
s1.method1();
s2.method2();
};
this.m2 = function() {
alert("вызван Facade.m2");
s2.methodB();
};
}
/* Client */
function Test() {
var facade = new Facade();
facade.m1();
facade.m2();
}
var obj = new Test();
/*
Выведет:
"вызван Facade.m1"
"вызван SubSystem2.method1"
"вызван SubSystem2.method2"
"вызван Facade.m2"
"вызван SubSystem2.methodB"
*/
PHP
/* Сложные части системы */
class CPU
{
public function freeze() { /* ... */ }
public function jump( $position ) { /* ... */ }
public function execute() { /* ... */ }
}
class Memory
{
public function load( $position, $data ) { /* ... */ }
}
class HardDrive
{
public function read( $lba, $size ) { /* ... */ }
}
/* Фасад */
class Computer
{
protected $cpu = null;
protected $memory = null;
protected $hardDrive = null;
public function __construct()
{
$this->cpu = new CPU();
$this->memory = new Memory();
$this->hardDrive = new HardDrive();
}
public function startComputer()
{
$this->cpu->freeze();
$this->memory->load( BOOT_ADDRESS, $this->hardDrive->read( BOOT_SECTOR, SECTOR_SIZE ) );
$this->cpu->jump( BOOT_ADDRESS );
$this->cpu->execute();
}
}
/* Клиентская часть */
$facade = new Computer();
$facade->startComputer();
C#
using System;
namespace Library
{
/// <summary>
/// Класс подсистемы
/// </summary>
/// <remarks>
/// <li>
/// <lu>реализует функциональность подсистемы;</lu>
/// <lu>выполняет работу, порученную объектом <see cref="Facade"/>;</lu>
/// <lu>ничего не "знает" о существовании фасада, то есть не хранит ссылок на него;</lu>
/// </li>
/// </remarks>
internal class SubsystemA
{
internal string A1()
{
return "Subsystem A, Method A1\n";
}
internal string A2()
{
return "Subsystem A, Method A2\n";
}
}
internal class SubsystemB
{
internal string B1()
{
return "Subsystem B, Method B1\n";
}
}
internal class SubsystemC
{
internal string C1()
{
return "Subsystem C, Method C1\n";
}
}
}
/// <summary>
/// Facade - фасад
/// </summary>
/// <remarks>
/// <li>
/// <lu>"знает", каким классами подсистемы адресовать запрос;</lu>
/// <lu>делегирует запросы клиентам подходящим объектам внутри подсистемы;</lu>
/// </li>
/// </remarks>
public static class Facade
{
static Library.SubsystemA a = new Library.SubsystemA();
static Library.SubsystemB b = new Library.SubsystemB();
static Library.SubsystemC c = new Library.SubsystemC();
public static void Operation1()
{
Console.WriteLine("Operation 1\n" +
a.A1() +
a.A2() +
b.B1());
}
public static void Operation2()
{
Console.WriteLine("Operation 2\n" +
b.B1() +
c.C1());
}
}
class Program
{
static void Main(string[] args)
{
Facade.Operation1();
Facade.Operation2();
// Wait for user
Console.Read();
}
}
Источники и ссылки
- Gamma и др. Design Patterns. Reading. MA: Addison-Wesley, 1995.
структурные шаблоны проектирования |
адаптер | мост | компоновщик | декоратор | фасад | заместитель | приспособленец | Выделение частного класса данных |
bg:Фасада (шаблон) de:Fassade (Entwurfsmuster) en:Facade pattern es:Facade (patrón de diseño) fr:Façade (patron de conception) it:Façade pattern ja:Facade パターン ko:Facade 패턴 nl:Façade (informatica) pl:Fasada (wzorzec projektowy) pt:Façade th:ฟะซาดแพตเทิร์น vi:Facade pattern zh:外觀模式
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....