#《Head First 设计模式》例子的C++实现(7 Facade 模式)
Facade 模式与适配器模式类似,都是让原有功能代码呈现另一种接口方式。
这个设计模式比较简单,就不多介绍了。
下面是代码:
class PopcornPopper;
class Projector;
class Amplifier;
class DvdPlayer;
class WatchMovieFacade
{
public:
WatchMovieFacade(PopcornPopper * popper, Projector * projector, Amplifier * amp, DvdPlayer * dvd);
void startWatchMovie(QString movieName);
void endWatchMovie();
private:
PopcornPopper * m_popper;
Projector * m_projector;
Amplifier * m_amp;
DvdPlayer * m_dvd;
};
WatchMovieFacade::WatchMovieFacade(PopcornPopper * popper, Projector * projector, Amplifier * amp, DvdPlayer * dvd)
: m_popper(popper),
m_projector(projector),
m_amp(amp),
m_dvd(dvd)
{
}
void WatchMovieFacade::startWatchMovie(QString movieName)
{
m_popper->on();
m_popper->pop();
m_projector->on();
m_projector->setInput("DVD");
m_projector->wideScreenMode();
m_amp->on();
m_amp->setMode("DVD");
m_amp->setVolume(10);
m_dvd->on();
m_dvd->play(movieName);
}
void WatchMovieFacade::endWatchMovie()
{
m_popper->off();
m_projector->off();
m_amp->off();
m_dvd->off();
}
测试代码如下:
DvdPlayer dvd;
Projector projector;
PopcornPopper popper;
Amplifier amp;
WatchMovieFacade watchMovie(&popper, &projector, &, &dvd);
QString MovieName = "<<The Cabin In The Woods>>";
qDebug() << "Jim pressed the button to watch the movie " << MovieName << "......";
watchMovie.startWatchMovie(MovieName);
qDebug() << "\r\nAn hour later......";
qDebug() << "Jim pressed the button to end the movie......";
watchMovie.endWatchMovie();
输出结果如下:
Jim pressed the button to watch the movie "<<The Cabin In The Woods>>" ......
(Popper class): Popper has open
(Popper class): Popper is working
(Projector class): Projector has open
(Projector class): Projector is the "DVD" mode
(Projector class): Projector is widescreen mode
(Amp class): Amp has open
(Amp class): Amp is "DVD" mode
(Amp class): Amp sound is 10
(Dvd class): Dvd has open
(Dvd class): Dvd playing "<<The Cabin In The Woods>>"
An hour later......
Jim pressed the button to end the movie......
(Popper class): Popper has close
(Projector class): Projector has close
(Amp class): Amp has close
(Dvd class): Dvd has close
例子中几个辅助类的代码如下:
class Amplifier
{
public:
Amplifier();
void on();
void off();
void setMode(QString dvdOrCd);
void setVolume(int volume);
};
class DvdPlayer
{
public:
DvdPlayer();
void on();
void off();
void play(QString movieOrMusic);
};
class PopcornPopper
{
public:
PopcornPopper();
void on();
void pop();
void off();
};
class Projector
{
public:
Projector();
void on();
void off();
void setInput(QString dvdOrCd);
void wideScreenMode();
};
Amplifier::Amplifier()
{
}
void Amplifier::on()
{
qDebug() << "(Amp class): Amp has open";
}
void Amplifier::off()
{
qDebug() << "(Amp class): Amp has close";
}
void Amplifier::setMode(QString dvdOrCd)
{
qDebug() << "(Amp class): Amp is " << dvdOrCd << " mode";
}
void Amplifier::setVolume(int volume)
{
qDebug() << "(Amp class): Amp sound is " << volume;
}
DvdPlayer::DvdPlayer()
{
}
void DvdPlayer::on()
{
qDebug() << "(Dvd class): Dvd has open";
}
void DvdPlayer::off()
{
qDebug() << "(Dvd class): Dvd has close";
}
void DvdPlayer::play(QString movieOrMusic)
{
qDebug() << "(Dvd class): Dvd playing " << movieOrMusic;
}
PopcornPopper::PopcornPopper()
{
}
void PopcornPopper::on()
{
qDebug() << "(Popper class): Popper has open";
}
void PopcornPopper::pop()
{
qDebug() << "(Popper class): Popper is working";
}
void PopcornPopper::off()
{
qDebug() << "(Popper class): Popper has close";
}
Projector::Projector()
{
}
void Projector::on()
{
qDebug() << "(Projector class): Projector has open";
}
void Projector::off()
{
qDebug() << "(Projector class): Projector has close";
}
void Projector::setInput(QString dvdOrCd)
{
qDebug() << "(Projector class): Projector is the " << dvdOrCd << " mode";
}
void Projector::wideScreenMode()
{
qDebug() << "(Projector class): Projector is widescreen mode";
}