Фасад (шаблон проектирования)
Шаблон Facade (Фасад) — Шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.
Описание
Проблема
Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Решение
Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна Устойчивый к изменениям (Protected Variations) с точки зрения защиты от изменений в реализации подсистемы.
Особенности применения
Шаблон применяется для установки некоторого рода политики по отношению к другой группе объектов. Если политика должна быть яркой и заметной, следует воспользоваться услугами шаблона Фасад. Если же необходимо обеспечить скрытность и аккуратность (прозрачность), более подходящим выбором является шаблон Заместитель (Proxy).
Примеры
JavaScript
<source lang="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"
- /
</source>
PHP
<source lang="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(); </source>
C#
<source lang="csharp">
using System;
namespace Library {
/// <summary> /// Класс подсистемы /// </summary> /// <remarks>
///
/// </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> ///
/// </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(); } } </source>
Источники и ссылки
- 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 и ещё....