1、作用
(1)、将各个子系统的接口汇聚在一起,定义一个统一的接口方便客户使用,满足“迪米特法则”,即客户不需要了解子系统,只需要知道Facade模式封装的类即可以使用所有子系统。
(2)、隔离用户和子系统,将用户与子系统解耦,当子系统有修改是,顶多修改Facade模式封装的类,无需修改用户代码。
2、实现方式
这个模式有点像适配器模式。
相同点:都是接口在套一层接口。
不同点:(1)、适配器模式,外层接口与内存层接口不一样,而外观模式一般是内存接口和外层接口一样,甚至名字都一样。
(2)、适配器模式只封装一个接口,外观模式则是封装很多子系统的接口。
下面以一个MobilePhone的大系统通过Facade模式封装子系统功能的UML图:Facade就是系统封装子系统的接口,用户通过调用系统层(Facade)的接口来调用子系统。
3、C++代码
MobilePhone.h
#include <iostream> #ifndef __MOBILE_PHONE__H__ #define __MOBILE_PHONE__H__ using namespace std; class BaseBand { public: void call() { cout<<"打电话..."<<endl; } void hungup() { cout<<"挂电话..."<<endl; } }; class Camera { public: void takePicture() { cout<<"拍照片"<<endl; } }; class MobilePhone { public: void call() { baseBand.call(); } void hungup() { baseBand.hungup(); } void takePicture() { camera.takePicture(); } private: BaseBand baseBand; Camera camera; }; #endif
test.cc
#include "MobilePhone.h" int main() { MobilePhone mobilePhone; mobilePhone.call(); mobilePhone.hungup(); mobilePhone.takePicture(); return 0; }
输出: