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

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

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

Описание

Файл:Facade.gif

Проблема

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

Решение

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