《Head First 设计模式》例子的C++实现(7 Facade 模式)

#《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, &amp, &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";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值