Класс HomeTheaterFacade - Nero-ro/Facade GitHub Wiki

Для начала мы создаём фасадный интерфейс домашнего кинотеатра. Класс HomeTheaterFacade предоставляет простые методы — такие, как watchMovie().

Класс фасада рассматривает компоненты домашнего кинотеатра как подсистему и обращается с вызовами к этой подсистеме для реализации своего метода watchMovie().

Клиентский код теперь обращается с вызовами к фасадному классу домашнего кинотеатра, а не к подсистеме. Таким образом, чтобы просмотреть фильм, мы вызываем всего один метод — watchMovie(), — а тот берет на себя все взаимодействие с освещением, DVD-проигрывателем, проектором, усилителем, экраном и т. д

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

Композиция: компоненты подсистемы, которые мы собираемся использовать.

В конструкторе фасада передаются ссылки на все компоненты. Фасад присваивает их соответствующим переменным экземпляра.

Класс HomeTheaterFacade содержит следующие методы:

  • watchMovie()
  • endMovie()
  • listenToCd()
  • endCd()
  • listenToRadio()
  • endRadio()

И контактирует со следующими классами:

  • Amplifer
  • Tuner
  • DvdPlayer
  • CdPlayer
  • Screen
  • Projector
  • PopcornPopper
  • TheaterLights

Полный код Класса HomeTheaterFacade (.h):


#include

#include

#include "amplifier.h"

#include "tuner.h"

#include "dvdplayer.h"

#include "cdplayer.h"

#include "projector.h"

#include "screen.h"

#include "popcornpopper.h"

#include "theaterlights.h"

using namespace std;

class HomeTheaterFacade

{

private:

Amplifier *amp;
Tuner *tuner;
DvdPlayer *dvd;
CdPlayer *cd;
Projector *projector;
TheaterLights *lights;
Screen *screen;
PopcornPopper *popper;

public:

HomeTheaterFacade(Amplifier*,Tuner*,DvdPlayer*,CdPlayer*,Projector*,TheaterLights*,Screen*,PopcornPopper*);
void watchMovie(QString movie);
void endMovie();
void listenToCd(QString cdTitle);
void endCd();
void listenToRadio(double frequency);
void endRadio();

};


Часть (.cpp)

#include "hometheaterfacade.h"

HomeTheaterFacade::HomeTheaterFacade(Amplifier *amp,Tuner *tuner,DvdPlayer *dvd,

                                 CdPlayer *cd,Projector *projector,TheaterLights *lights,
                                 Screen *screen,PopcornPopper *popper)

{

this->amp = amp;
this->tuner = tuner;
this->dvd = dvd;
this->cd = cd;
this->projector = projector;
this->screen = screen;
this->lights = lights;
this->popper = popper;

}

void HomeTheaterFacade::watchMovie(QString movie) {

cout << "Get ready to watch a movie..." << endl;
popper->on();
popper->pop();
lights->dim(10);
screen->down();
projector->on();
projector->wideScreenMode();
amp->on();
amp->setDvd(dvd);
amp->setSurroundSound();
amp->setVolume(5);
dvd->on();
dvd->play(movie);

}

void HomeTheaterFacade::endMovie() {

cout << "Shutting movie theater down..." << endl;
popper->off();
lights->on();
screen->up();
projector->off();
amp->off();
dvd->stop();
dvd->eject();
dvd->off();

}

void HomeTheaterFacade::listenToCd(QString cdTitle) {

cout << "Get ready for an audiopile experence..." << endl;
lights->on();
amp->on();
amp->setVolume(5);
amp->setCd(cd);
amp->setStereoSound();
cd->on();
cd->play(cdTitle);

}

void HomeTheaterFacade::endCd() {

cout << "Shutting down cd->.." << endl;
amp->off();
amp->setCd(cd);
cd->eject();
cd->off();

}

void HomeTheaterFacade::listenToRadio(double frequency) {

cout << "Tuning in the airwaves..." << endl;
tuner->on();
tuner->setFrequency(frequency);
amp->on();
amp->setVolume(5);
amp->setTuner(tuner);

}

void HomeTheaterFacade::endRadio() {

cout << "Shutting down the tuner->.." << endl;
tuner->off();
amp->off();

}


Метод watchMovie() выполняет те же операции, которые ранее выполнялись нами вручную. Обратите внимание: выполнение каждой операции делегируется соответствующему компоненту подсистемы.

Метод endMovie() выключает всю аппаратуру за нас. И снова каждая операция делегируется соответствующему компоненту подсистемы.

⚠️ **GitHub.com Fallback** ⚠️