Фасад (Facade)

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

К основной странице курса

Назначение

Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.

Описание

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

Использование

Паттерн Фасад используется:

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

Реализация

Диаграмма классов

FacadeCommon.png

Участники

  • Facade - фасад

Знает, каким классам подсистемы адресовать запрос Делегирует запросы клиентов подходящим объектам внутри подсистемы

  • Классы подсистемы
  • Реализуют функциональность подсистемы
  • Выполняют работу, порученную объекту Facade
  • Ничего не знают о существовании фасада

Пример

class MainApp
{
    public static void Main()
    {
        Facade facade = new Facade();

        facade.MethodA();
        facade.MethodB();
    }
}

class SubSystemOne
{
    public void MethodOne()
    {
        Console.WriteLine(" SubSystemOne Method");
    }
}

class SubSystemTwo
{
    public void MethodTwo()
    {
        Console.WriteLine(" SubSystemTwo Method");
    }
}

class SubSystemThree
{
    public void MethodThree()
    {
        Console.WriteLine(" SubSystemThree Method");
    }
}

class Facade
{
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;

    public Facade()
    {
        one = new SubSystemOne();
        two = new SubSystemTwo();
        three = new SubSystemThree();
    }

    public void MethodA()
    {
        Console.WriteLine("\nMethodA() ---- ");
        one.MethodOne();
        two.MethodTwo();
    }

    public void MethodB()
    {
        Console.WriteLine("\nMethodB() ---- ");
        two.MethodTwo();
        three.MethodThree();
    }
}

Достоинства и недостатки

  • Изолирует клиентов от компонентов подсистемы
  • Позволяет ослабить связность между подсистемой и ее клиентами

Варианты

  • Класс Facade можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы
  • Несколько подсистем взаимодействуют только своими фасадами