🎉 Ура! После трёх лет работы, я наконец выпустил английскую версию книги о паттернах! Вот она »

C#: Фасад

Facade Фасад Facade

Фасад — это структурный паттерн, который предоставляет простой (но урезанный) интерфейс к сложной системе объектов, библиотеке или фреймворку.

Кроме того, что Фасад позволяет снизить общую сложность программы, он также помогает вынести код, зависимый от внешней системы в единственное место.

Подробней о Фасаде

Особенности паттерна на C#

Сложность:

Популярность:

Применимость: Паттерн часто встречается в клиентских приложениях, написанных на C#, которые используют классы-фасады для упрощения работы со сложными библиотеки или API.

Признаки применения паттерна: Фасад угадывается в классе, который имеет простой интерфейс, но делегирует основную часть работы другим классам. Чаще всего, фасады сами следят за жизненным циклом объектов сложной системы.

Пример: Структура паттерна

Этот пример показывает структуру паттерна Фасад, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

Program.cs: Пример структуры паттерна

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RefactoringGuru.DesignPatterns.Facade.Structural
{
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();

            Subsystem1 s1 = new Subsystem1();
            Subsystem2 s2 = new Subsystem2();
            Facade facade = new Facade(s1, s2);
            client.ClientCode(facade);
        }
    }

    class Client
    {
        internal void ClientCode(Facade facade)
        {
            Console.WriteLine(facade.Operation());
        }
    }

    public class Subsystem1
    {
        public string operation1()
        {
            return "Subsystem1: Ready!\n";
        }

        public string operationN()
        {
            return "Subsystem1: Go!\n";
        }
    }
	
    public class Subsystem2
    {
        public string operation1()
        {
            return "Subsystem2: Get ready!\n";
        }

        public string operationZ()
        {
            return "Subsystem2: Fire!\n";
        }
    }

    public class Facade
    {
        Subsystem1 Subsystem1;
		
        Subsystem2 Subsystem2;

        public Facade(Subsystem1 s1, Subsystem2 s2)
        {
            this.Subsystem1 = s1;
            this.Subsystem2 = s2;
        }
		
        public string Operation()
        {
            string result = "Facade initializes subsystems:\n";
            result += Subsystem1.operation1();
            result += Subsystem2.operation1();
            result += "Facade orders subsystems to perform the action:\n";
            result += Subsystem1.operationN();
            result += Subsystem2.operationZ();
            return result;
        }
    }
}

Output.txt: Результат выполнения

Facade initializes subsystems:
Subsystem1: Ready!
Subsystem2: Get ready!
Facade orders subsystems to perform the action:
Subsystem1: Go!
Subsystem2: Fire!