为子系统中的一组接口提供一个一致的界面,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; }