Фасад (шаблон проектирования)
Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Шаблон 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.
| структурные шаблоны проектирования |
|
адаптер | мост | компоновщик | декоратор | фасад | заместитель | приспособленец | Выделение частного класса данных |
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:外觀模式