Урок 9. Фасад (Facade)
Шаблон проектирования "Фасад" (Facade) предоставляет упрощенный интерфейс к сложной системе классов, библиотек или фреймворков. Он скрывает сложность системы и предоставляет клиенту более простой способ взаимодействия с ней.
Пример использования паттерна Facade на Java
Рассмотрим пример, в котором мы создадим систему для управления домашним кинотеатром. У нас будет несколько компонентов: Amplifier
, DVDPlayer
, Projector
и Screen
. Фасад будет предоставлять простой интерфейс для управления всеми этими компонентами.
Шаг 1: Создание классов компонентов
public class Amplifier {
public void on() {
System.out.println("Amplifier is on");
}
public void off() {
System.out.println("Amplifier is off");
}
public void setVolume(int level) {
System.out.println("Setting volume to " + level);
}
}
public class DVDPlayer {
public void on() {
System.out.println("DVD Player is on");
}
public void off() {
System.out.println("DVD Player is off");
}
public void play(String movie) {
System.out.println("Playing movie: " + movie);
}
}
public class Projector {
public void on() {
System.out.println("Projector is on");
}
public void off() {
System.out.println("Projector is off");
}
public void setInput(DVDPlayer dvdPlayer) {
System.out.println("Projector input set to DVD Player");
}
}
public class Screen {
public void down() {
System.out.println("Screen is down");
}
public void up() {
System.out.println("Screen is up");
}
}
Шаг 2: Реализация фасада
public class HomeTheaterFacade {
private Amplifier amplifier;
private DVDPlayer dvdPlayer;
private Projector projector;
private Screen screen;
public HomeTheaterFacade(Amplifier amplifier, DVDPlayer dvdPlayer, Projector projector, Screen screen) {
this.amplifier = amplifier;
this.dvdPlayer = dvdPlayer;
this.projector = projector;
this.screen = screen;
}
public void watchMovie(String movie) {
System.out.println("Get ready to watch a movie...");
screen.down();
projector.on();
projector.setInput(dvdPlayer);
amplifier.on();
amplifier.setVolume(5);
dvdPlayer.on();
dvdPlayer.play(movie);
}
public void endMovie() {
System.out.println("Shutting movie theater down...");
dvdPlayer.off();
amplifier.off();
projector.off();
screen.up();
}
}
Шаг 3: Использование фасада
Теперь мы можем использовать наш фасад в коде:
public class FacadePatternDemo {
public static void main(String[] args) {
Amplifier amplifier = new Amplifier();
DVDPlayer dvdPlayer = new DVDPlayer();
Projector projector = new Projector();
Screen screen = new Screen();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier, dvdPlayer, projector, screen);
// Начинаем просмотр фильма
homeTheater.watchMovie("Inception");
System.out.println("");
// Завершаем просмотр фильма
homeTheater.endMovie();
}
}
Объяснение
-
Классы компонентов:
Amplifier
,DVDPlayer
,Projector
иScreen
представляют собой различные компоненты домашнего кинотеатра. Каждый из них имеет свои методы для управления. -
Класс
HomeTheaterFacade
: Этот класс объединяет все компоненты и предоставляет простой интерфейс для их управления. МетодыwatchMovie()
иendMovie()
упрощают процесс подготовки к просмотру фильма и его завершения. -
Класс
FacadePatternDemo
: Демонстрирует использование фасада. Мы создаем экземпляры всех компонентов и передаем их в фасад. Затем вызываем методы для начала и завершения просмотра фильма.
Заключение
Паттерн "Фасад" упрощает взаимодействие с сложными системами, предоставляя клиентам более простой интерфейс. В приведенном примере мы увидели, как можно создать фасад для управления домашним кинотеатром, скрывая сложность взаимодействия с отдельными компонентами.
пример
https://gitlab.com/synergy9980417/razdel2/7_9