Класс HomeTheaterFacade - Nero-ro/Facade GitHub Wiki
Для начала мы создаём фасадный интерфейс домашнего кинотеатра. Класс HomeTheaterFacade предоставляет простые методы — такие, как watchMovie().
Класс фасада рассматривает компоненты домашнего кинотеатра как подсистему и обращается с вызовами к этой подсистеме для реализации своего метода watchMovie().
Клиентский код теперь обращается с вызовами к фасадному классу домашнего кинотеатра, а не к подсистеме. Таким образом, чтобы просмотреть фильм, мы вызываем всего один метод — watchMovie(), — а тот берет на себя все взаимодействие с освещением, DVD-проигрывателем, проектором, усилителем, экраном и т. д
Давайте по шагам разберем процесс построения фасада для домашнего кинотеатра. Прежде всего мы воспользуемся композицией, чтобы фасад имел доступ ко всем компонентам подсистемы:
Композиция: компоненты подсистемы, которые мы собираемся использовать.
В конструкторе фасада передаются ссылки на все компоненты. Фасад присваивает их соответствующим переменным экземпляра.
- watchMovie()
- endMovie()
- listenToCd()
- endCd()
- listenToRadio()
- endRadio()
- Amplifer
- Tuner
- DvdPlayer
- CdPlayer
- Screen
- Projector
- PopcornPopper
- TheaterLights
#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();
};
#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() выключает всю аппаратуру за нас. И снова каждая операция делегируется соответствующему компоненту подсистемы.