外观模式就是将子系统交给一个中间层Facade来进行管理,用户直接调用Facade的接口。
一般来说,如果功能较多,那么需要对功能模块进行单独实现,即实现子系统。然后对用户而言,需要对每个子系统进行直接的调用。
这样所产生的一个问题是,一旦某个子系统进行了接口的修改,那么用户对子系统的调用都需要修改。
如果使用Façade模式,对子系统的调用交给Facade类,用户只调用Facade类的接口,那么一旦子系统接口修改,那么只要修改Facade类的实现即可,用户不用进行任何修改。
1. 子系统定义
子系统定义是随意的,该模式对子系统无要求。
子系统根据自己的功能,自行定义自己的接口即可。
class Camera
{
public:
void TrunOn() {};
void TrunOff() {};
void Rotate(int degrees) {};
};
class Light
{
public:
void TrunOn() {};
void TrunOff() {};
};
class Screen
{
public:
void TrunOn() {};
void TrunOff() {};
};
2. Facade定义
Facade类负责统领各个子系统,并提供统一的接口。
其基本要求是,当子系统发生变化时,Facade类仅仅内部实现改变,但其提供的接口不变。这样对于用户而言,无需修改对Facade类的调用。
class Facade
{
public:
Facade()
{
_camera = new Camera();
_lights = new Light();
_Screen = new Screen();
}
~Facade()
{
delete _camera;
delete _lights;
delete _Screen;
}
void Activate()
{
_camera->TrunOn();
_camera->Rotate(90);
_lights->TrunOn();
_Screen->TrunOn();
}
void Deactivate()
{
_camera->TrunOff();
_camera->Rotate(0);
_lights->TrunOff();
_Screen->TrunOff();
}
private:
Camera *_camera;
Light *_lights;
Screen *_Screen;
};
3. 用户调用
用户调用时,直接对Facade类进行调用,而不关心子系统的接口与实现。
void main()
{
Facade * facade = new Facade();
facade->Activate();
std::cout << "直播中!" << std::endl;
facade->Deactivate();
}