[结构型模式] head first 设计模式之外观模式(Facade)

1 目的
  为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式的意图是简化接口。

2 优点
  a) 它对客户屏蔽子系统组件,因而减少了客户处理对的数目并使得子系统使用起来更加方便。
  b) 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
  c) 如果应用需要,它并不现在它们使用子系统类,因此你可以在系统易用性和通用性之间加以选择。
 



//Facade
//////////////////////////////////////////////////////////////////////////
class Amplifier;
class Tuner;
class DvdPlayer;
class CdPlayer;
class Projector;
class TheaterLights;
class Screen;
class PopcornPopper;
//////////////////////////////////////////////////////////////////////////
class HomeThreaterFacade
{
public:
    HomeThreaterFacade(Amplifier* amplifier, Tuner* tuner,
    DvdPlayer* dvdPlayer, CdPlayer* cdPlayer, Projector* projector, 
    TheaterLights* theaterLights, Screen* screen, PopcornPopper* popcornPopper)
    {
        m_Amplifier = amplifier;
        m_Tuner = tuner;
        m_DvdPlayer = dvdPlayer;
        m_CdPlayer = cdPlayer;
        m_Projector = projector;
        m_TheaterLights = theaterLights;
        m_Screen = screen;
        m_PopcornPopper = popcornPopper;
    }

    void watchMovie(string movie)
    {
        cout << "Get ready to watch a movie..."  << endl;
//         m_PopcornPopper->on();
//         m_PopcornPopper->pop();
//         m_TheaterLights->dim(10);
//         m_Screen->down();
//         m_Projector->on();
//         m_Projector->wideScreenMode();
//         m_Amplifier->on();
//         m_Amplifier->setDvd(m_DvdPlayer);
//         m_Amplifier->setSurroundSound();
//         m_Amplifier->setVolume(5);
//         m_DvdPlayer->on();
//         m_DvdPlayer->play();
    }

    void endMovie(string movie)
    {
        cout << "Shtting movie theater down..."  << endl;

//         m_PopcornPopper->off();
//         m_TheaterLights->on();
//         m_Screen->up();
//         m_Projector->off();
//         m_Amplifier->off();
//         m_DvdPlayer->stop();
//         m_DvdPlayer->eject();
//         m_DvdPlayer->off();

    }
private:
    Amplifier*     m_Amplifier;
    Tuner*         m_Tuner;
    DvdPlayer*     m_DvdPlayer;
    CdPlayer*      m_CdPlayer;
    Projector*     m_Projector;
    TheaterLights* m_TheaterLights;
    Screen*        m_Screen;
    PopcornPopper* m_PopcornPopper;
};

//////////////////////////////////////////////////////////////////////////
class HomeThreaterTestDrive
{
public:
    void run()
    {
//         HomeThreaterFacade* homeTheater = new HomeThreaterFacade();
//         homeTheater->watchMovie("Raiders of the Lost Ark");
//         homeTheater->endMovie();
    }
};


标准示例
#include <iostream>
using namespace std;

class Subsystem1
{
public:
    Subsystem1(){}
    ~Subsystem1(){}

    void Operation()
    {
        cout<<"Subsystem1 operation."<<endl;
    }
};

class Subsystem2
{
public:
    Subsystem2(){}
    ~Subsystem2(){}

    void Operation()
    {
        cout<<"Subsystem2 operation."<<endl;
    }
};

class Facade
{
public:
    Facade()
    {
        this->_subs1 = new Subsystem1();
        this->_subs2 = new Subsystem2();
    }

    ~Facade()
    {
        delete _subs1;
        delete _subs2;
    }

    void OperationWrapper()
    {
        this->_subs1->Operation();
        this->_subs2->Operation();
    }

private:
    Subsystem1 *_subs1;
    Subsystem2 *_subs2;
};

int main(int argc, char *argv[])
{
	Facade *f = new Facade();
	f->OperationWrapper();

	return 0;
}

猜你喜欢

转载自jacky-dai.iteye.com/blog/1929194
今日推荐