Фасад (шаблон проектирования)

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Шаблон Facade (Фасад) — Шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

Описание

Файл:Facade.gif

Проблема

Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?

Решение

Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна Устойчивый к изменениям (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>

///

  • /// <lu>реализует функциональность подсистемы;</lu> /// <lu>выполняет работу, порученную объектом <see cref="Facade"/>;</lu> /// <lu>ничего не "знает" о существовании фасада, то есть не хранит ссылок на него;</lu> ///
  • /// </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> ///

  • /// <lu>"знает", каким классами подсистемы адресовать запрос;</lu> /// <lu>делегирует запросы клиентам подходящим объектам внутри подсистемы;</lu> ///
  • /// </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 и ещё....