Паттерны проектирования: Фасад (Facade)

Фасад (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();
Результат будет следующий:

Исходный код учебного проекта: http://1drv.ms/1xWxemL

Добавить комментарий