Фасад (Facade)
Материал из Вики ИТ мехмата ЮФУ
Назначение
Предоставляет простой интерфейс к большой системе, которая обычно представляет множество взаимосвязанных классов.
Описание
Разбиение на подсистемы и сведение к минимуму зависимостей подсистем - цель любого проектирования. Один из способов решения этой задачи - представление объекта Фасад, предоставляющего единый упрощенный интерфейс к сложной системе.
Назначение
Паттерн Фасад используется:
- когда требуется предоставить простой интерфейс к сложной подсистеме
- когда необходимо отделить подсистему от клиентов, повышая переносимость
- когда требуется разбить подсистему на слои. Если подсистемы зависят друг от друга, то можно разрешить им обмениваться информацией только через фасады
Реализация
Диаграмма классов
Участники
- 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 можно сделать абстрактным. Его конкретные подклассы будут соответствовать различным реализациям подсистемы