Статьи

Пример шаблона дизайна фасада

Эта статья является частью нашего курса Академии под названием « Шаблоны проектирования Java» .

В этом курсе вы изучите огромное количество шаблонов проектирования и увидите, как они реализуются и используются в Java. Вы поймете причины, почему шаблоны так важны, и узнаете, когда и как применять каждый из них. Проверьте это здесь !

1. Введение

В этом уроке мы обсудим другой структурный паттерн, т. Е. Фасадный паттерн. Но прежде чем углубляться в детали этого, давайте обсудим проблему, которая будет решена этим конкретным паттерном.

Ваша компания является компанией, основанной на продуктах, и она выпустила на рынок продукт под названием Schedule Server. Это своего рода сервер, и он используется для управления заданиями. Заданиями могут быть любые виды работ, такие как отправка списка электронных писем, смс, чтение или запись файлов из пункта назначения или просто передача файлов из источника в пункт назначения. Продукт используется разработчиками для управления такого рода работами и может сосредоточиться на достижении своей бизнес-цели. Сервер выполняет каждое задание в указанное время, а также самостоятельно управляет всеми подчеркиваемыми проблемами, такими как проблема параллелизма и безопасности. Как разработчику, нужно всего лишь кодировать только соответствующие бизнес-требования, и предоставляется достаточное количество вызовов API для планирования работы в соответствии с их потребностями.

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

Нам нужно предоставить простой способ запуска и остановки сервера.

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

Шаблон фасада может помочь нам решить эту проблему дизайна. Но перед этим давайте посмотрим на шаблон фасада.

2. Что такое шаблон фасада

Шаблон фасада упрощает использование сложного интерфейса, используя класс Facade. Шаблон фасада предоставляет унифицированный интерфейс для набора интерфейсов в подсистеме. Фасад определяет высокоуровневый интерфейс, который упрощает использование подсистемы.

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

Фасад не инкапсулирует классы подсистем или интерфейсы; это просто обеспечивает упрощенный интерфейс для их функциональности. Клиент может получить доступ к этим классам напрямую. Это все еще предоставляет полную функциональность системы для клиентов, которые могут нуждаться в этом.

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

Клиенты связываются с подсистемой, отправляя запросы в Facade, который перенаправляет их в соответствующий объект (ы) подсистемы. Хотя объекты подсистемы выполняют фактическую работу, фасаду, возможно, придется выполнять свою собственную работу для преобразования своего интерфейса в интерфейсы подсистемы. Клиенты, которые используют фасад, не должны напрямую обращаться к объектам своей подсистемы.

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

фигура 1

фигура 1

3. Решение проблемы

Проблема, с которой сталкиваются клиенты при использовании сервера расписаний, заключается в сложности, с которой сервер сталкивается для запуска и остановки своих служб. Клиент хочет простой способ сделать это. Ниже приведен код, который клиенты должны были написать для запуска и остановки сервера.

1
ScheduleServer scheduleServer = new ScheduleServer();

Чтобы запустить сервер, клиент должен создать объект класса ScheduleServer, а затем вызвать последовательности нижеприведенных методов для запуска и инициализации сервера.

1
2
3
4
5
6
7
8
9
scheduleServer.startBooting();
scheduleServer.readSystemConfigFile();
scheduleServer.init();
scheduleServer.initializeContext();
scheduleServer.initializeListeners();
scheduleServer.createSystemObjects();
 
System.out.println("Start working......");
System.out.println("After work done.........");

Чтобы остановить сервер, клиент должен вызвать следующие методы в той же последовательности.

1
2
3
4
5
6
scheduleServer.releaseProcesses();
scheduleServer.destory();
scheduleServer.destroySystemObjects();
scheduleServer.destoryListeners();
scheduleServer.destoryContext();
scheduleServer.shutdown();

Это выглядит бременем для них, они не заинтересованы в том, чтобы делать все эти вещи, и с чего бы это им? Хотя это может показаться интересным для некоторых клиентов, которые могут быть заинтересованы в низкоуровневом интерфейсе системы, большинству из них это не понравилось.

Чтобы решить эту проблему, мы создадим класс фасадов, который обернет объект сервера. Этот класс будет предоставлять простые интерфейсы (методы) для клиента. Эти интерфейсы внутри будут вызывать методы объекта сервера. Давайте сначала посмотрим код, а затем обсудим больше о нем.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.javacodegeeks.patterns.facadepattern;
 
public class ScheduleServerFacade {
     
    private final ScheduleServer scheduleServer;
     
    public ScheduleServerFacade(ScheduleServer scheduleServer){
        this.scheduleServer = scheduleServer;
    }
     
    public void startServer(){
         
        scheduleServer.startBooting();
        scheduleServer.readSystemConfigFile();
        scheduleServer.init();
        scheduleServer.initializeContext();
        scheduleServer.initializeListeners();
        scheduleServer.createSystemObjects();
    }
     
    public void stopServer(){
         
        scheduleServer.releaseProcesses();
        scheduleServer.destory();
        scheduleServer.destroySystemObjects();
        scheduleServer.destoryListeners();
        scheduleServer.destoryContext();
        scheduleServer.shutdown();
    }
 
}

Вышеупомянутый класс ScheduleServerFacade является классом фасада, который оборачивает объект ScheduleServer , создает экземпляр объекта сервера через его конструктор и имеет два простых метода: startServer() и stopServer() . Эти методы внутренне выполняют запуск и остановку сервера. Клиенту просто нужно вызвать эти простые методы. Теперь нет необходимости вызывать все методы жизненного цикла и уничтожать, только простые методы и остальная часть процесса будут выполняться классом фасадов.

Код ниже показывает, как фасад делает сложный интерфейс простым в использовании.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.javacodegeeks.patterns.facadepattern;
 
public class TestFacade {
 
    public static void main(String[] args) {
         
        ScheduleServer scheduleServer = new ScheduleServer();
        ScheduleServerFacade facadeServer = new ScheduleServerFacade(scheduleServer);
        facadeServer.startServer();
         
        System.out.println("Start working......");
        System.out.println("After work done.........");
         
        facadeServer.stopServer();
    }
 
}

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

4. Использование шаблона фасада

Используйте шаблон фасада, когда:

  1. Вы хотите предоставить простой интерфейс для сложной подсистемы. Подсистемы часто становятся более сложными по мере своего развития. Большинство шаблонов, когда они применяются, приводят к большему количеству классов. Это делает подсистему более пригодной для повторного использования и более легкой в ​​настройке, но также становится сложнее в использовании для клиентов, которым не нужно настраивать ее. Фасад может предоставить простой вид по умолчанию подсистемы, который достаточно хорош для большинства клиентов. Только клиенты, нуждающиеся в большей настраиваемости, должны будут смотреть за пределы фасада.
  2. Существует много зависимостей между клиентами и классами реализации абстракции. Внедрите фасад для отделения подсистемы от клиентов и других подсистем, тем самым способствуя независимости и переносимости подсистем.
  3. Вы можете наслоить свои подсистемы. Используйте фасад для определения точки входа на каждый уровень подсистемы. Если подсистемы зависимы, то вы можете упростить зависимости между ними, заставляя их общаться друг с другом исключительно через их фасады.

5. Загрузите исходный код

Это был урок по Фасадному Образцу. Вы можете скачать исходный код здесь: FacadePattern-Project