
Фасад (Facade) — это поведенческий шаблон проектирования. Данный шаблон позволяет скрыть сложность системы путём сведения всех возможных вызовов к одному объекту, делегирующему их соответствующих объектам системы.
Простейшая схема работы паттерна:
Представим, что ми пишем программное обеспечение для микроволновой печи. Для простоты представим, что у неё есть только следующие функции: поворот влево и вправо, установка необходимой мощности, оповещение о начале и завершении работы.
Для того, чтобы приготовить вкусное блюдо, что-то разогреть или разморозить, необходимо выполнить определённое количество различных действий, в определённой последовательности. Например при разморозке, необходимо начиная с высоких мощностей несколько раз сбрасывать мощность, при этом вращая платформу с продуктом.
Если бы пользователю приходилось самому следить за каждым шагом процесса, то это было бы очень времязатратно и неэффективно. Ведь все знают, что на современной микроволновке достаточно выбрать нужную программу и нажать старт, после чего она сама сделает всё что необходимо, а по завершению оповестит пользователя.
Шаблон проектирования «фасад» занимается именно такими случаями. Он позволяет спрятать всю сложность процесса за простым интерфейсом.
Создадим классы для работы привода микроволновки (вращения), мощности и оповещения.
В классе привода, будет всего 2 действия: поворот направо и поворот налево.
class Drive
{
public void TurlLeft()
{
Console.WriteLine("Повернуть влево");
}
public void TurlRight()
{
Console.WriteLine("Повернуть вправо");
}
}
В классе задающем мощность, добавлено свойство для получения и установки необходимой мощности работы.
class Power
{
private int _power;
public int MicrowavePower {
get { return _power; }
set
{
_power = value;
Console.WriteLine("Задана мощность {0}w ", _power);
}
}
}
В классе оповещения добавлены методы для оповещения о начале и завершении работы.
class Notification
{
public void StopNotification()
{
Console.WriteLine("Пик-пик-пик - операция завершена");
}
public void StartNotification()
{
Console.WriteLine("Пик - начат процесс готовки");
}
}
Осталось реализовать сам класс микроволновой печи. В данном примере он же будет являться фасадом. В классе реализуем методы для разморозки и разогрева продуктов.
class Microwave
{
private Drive _drive;
private Power _power;
private Notification _notification;
public Microwave(Drive drive, Power power, Notification notification)
{
_drive = drive;
_power = power;
_notification = notification;
}
public void Defrost()
{
_notification.StartNotification();
_power.MicrowavePower = 1000;
_drive.TurlRight();
_drive.TurlRight();
_power.MicrowavePower = 500;
_drive.TurlLeft();
_drive.TurlLeft();
_power.MicrowavePower = 200;
_drive.TurlRight();
_drive.TurlRight();
_power.MicrowavePower = 0;
_notification.StopNotification();
}
public void Heating()
{
_notification.StartNotification();
_power.MicrowavePower = 350;
_drive.TurlRight();
_drive.TurlRight();
_drive.TurlRight();
_drive.TurlRight();
_drive.TurlRight();
_drive.TurlLeft();
_drive.TurlLeft();
_drive.TurlRight();
_drive.TurlRight();
_drive.TurlLeft();
_drive.TurlLeft();
_drive.TurlLeft();
_drive.TurlLeft();
_power.MicrowavePower = 0;
_notification.StopNotification();
}
}
Вот и всё, пример готов, осталось протестировать.
var drive = new Drive();
var power = new Power();
var notification = new Notification();
var microwave = new Microwave.Microwave(drive, power, notification);
Console.WriteLine("Разморозим");
microwave.Defrost();
Console.WriteLine();
Console.WriteLine("Подогреем");
microwave.Heating();
Результат будет следующий:
Исходный код учебного проекта: https://github.com/flash2048/Patterns/tree/master/Facade