外观模式
外观模式为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
代码示例
假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口,比如名为Compiler的类,里面有一个名为Run的函数。客户只需调用这个函数就可以编译程序,至于Run函数内部的具体操作,客户无需知道。
#include <iostream> using namespace std; class Scanner { public: void Scan() { cout<<"词法分析"<<endl; } }; class Parser { public: void Parse() { cout<<"语法分析"<<endl; } }; class GenMidCode { public: void GenCode() { cout<<"产生中间代码"<<endl; } }; class GenMachineCode { public: void GenCode() { cout<<"产生机器码"<<endl;} }; //高层接口 class Compiler { public: void Run() { Scanner scanner; Parser parser; GenMidCode genMidCode; GenMachineCode genMacCode; scanner.Scan(); parser.Parse(); genMidCode.GenCode(); genMacCode.GenCode(); } }; int main() { Compiler compiler; compiler.Run(); return 0; }
代码示例2
构造一个家庭影院,当启动watchMovie方法时可以看电影,当使用endMovie时关闭电影。
#include <iostream> using namespace std; //组件类 class Amplifier { public: void on() { cout << "Amplifier on" << endl; } void off() { cout << "Amplifier off" << endl; } }; class Tuner { public: void on() { cout << "Tuner on" << endl; } void off() { cout << "Tuner off" << endl; } }; class DvdPlayer { public: void on() { cout << "DvdPlayer on" << endl; } void off() { cout << "DvdPlayer off" << endl; } }; class Screen { public: void on() { cout << "Screen on" << endl; } void off() { cout << "Screen off" << endl; } }; //家庭影院 class HomeTheaterFacade { public: //统一接口 void watchMovie() { amp.on(); tuner.on(); dvd.on(); screen.on(); } void endMovie() { amp.off(); tuner.off(); dvd.off(); screen.off(); } HomeTheaterFacade(Amplifier am, Tuner tune, DvdPlayer dv, Screen scree) { amp = am; tuner = tune; dvd = dv; screen = scree; } //~HomeTheaterFacade(){} private: Amplifier amp; Tuner tuner; DvdPlayer dvd; Screen screen; }; //客户代码 int main() { Amplifier amp; Tuner tuner; DvdPlayer dvd; Screen screen; HomeTheaterFacade homeTheaterFacade(amp,tuner,dvd,screen);; homeTheaterFacade.watchMovie(); homeTheaterFacade.endMovie(); return 0; }
结果:
Amplifier on
Tuner on
DvdPlayer on
Screen on
Amplifier off
Tuner off
DvdPlayer off
Screen off