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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Діаграма класів

Фаса́д — шаблон проектування, призначений для об'єднання групи підсистем під один уніфікований інтерфейс, надаючи доступ до них через одну точку входу. Це дозволяє спростити роботу з підсистемами.

Фасад відноситься до структурних шаблонів проектування.

Складові шаблону[ред.ред. код]

Класи, з яких складається шаблон можна розділити на 3 частини:

  1. фасад;
  2. підсистеми;
  3. клієнти.

Ролі складових[ред.ред. код]

Фасад[ред.ред. код]

  • Визначає певним підсистемам інтерфейс, отже знає кому адресувати запити;
  • делегує запити клієнтів потрібним об'єктам підсистеми;
  • створює нові методи, котрі об'єднують виклики об'єктів системи і\або додають свою логіку;
  • приховує підсистеми;
  • зменшує кількість параметрів методів, шляхом попередньої підстановки визначених значень.

Підсистема[ред.ред. код]

  • реалізує функціонал, закритий та не видимий для зовнішніх компонентів
  • виконує роботу, запитану клієнтом через фасад.
  • не зберігає посилання на фасад - це означає що одна підсистема може мати довільну кількість фасадів.

Клієнт[ред.ред. код]

  • здійснює запити фасаду;
  • не знає про існування підсистем.

Випадки використання[ред.ред. код]

Фасад використовується у випадках, коли потрібно:

  • спростити доступ до складної системи;
  • створити рівні доступу до системи;
  • додати стійкість до змін підсистем;
  • зменшити кількість сильних зв'язків між клієнтом та підсистемою, але залишити доступ до повної функціональності.

Приклад C#[ред.ред. код]

using System;
 
namespace FacadeExample
{
    // Клас клієнта
    class Client
    {
        static void Main(string[] args)
        {
            //Створюємо єкземпляр фасаду - інтерфейс підсистем
            Facade facade = new Facade();
 
            facade.CallPaired();
            Console.WriteLine("\n\n");
            facade.CallUnpaired();
 
            Console.ReadKey();
        }
    }
 
    // Клас фасаду
    class Facade
    {
        Subsystem1 first;
        Subsystem2 second;
        Subsystem3 third;
        Subsystem4 fourth;
        Subsystem5 fifth;
 
        public Facade()
        {
            this.first = new Subsystem1();
            this.second = new Subsystem2();
            this.third = new Subsystem3();
            this.fourth = new Subsystem4();
            this.fifth = new Subsystem5();
        }
 
        //Виклик методів з підсистем Subsystem2 та Subsystem4
        public void CallPaired()
        {
            Console.WriteLine("Результати роботи методів підсистем з парним індексом (2,4)\n");
            second.Method();
            fourth.Method();
        }
 
        //Виклик методів з підсистем Subsystem1, Subsystem3 та Subsystem5
        public void CallUnpaired()
        {
            Console.WriteLine("Результати роботи методів підсистем з непарним індексом (1,3,5)\n");
            first.Method();
            third.Method();
            fifth.Method();
        }
    }
 
    // Клас підсистеми
    class Subsystem1
    {
        public void Method()
        {
            Console.WriteLine("Метод першої підсистеми");
        }
    }
 
    // Клас підсистеми
    class Subsystem2
    {
        public void Method()
        {
            Console.WriteLine("Метод другої підсистеми");
        }
    }
 
    // Клас підсистеми
    class Subsystem3
    {
        public void Method()
        {
            Console.WriteLine("Метод третьої підсистеми");
        }
    }
 
    // Клас підсистеми
    class Subsystem4
    {
        public void Method()
        {
            Console.WriteLine("Метод четвертої підсистеми");
        }
    }
 
    // Клас підсистеми
    class Subsystem5
    {
        public void Method()
        {
            Console.WriteLine("Метод п'ятої підсистеми");
        }
    }
}

Джерела[ред.ред. код]