定义
为了子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得子系统更加容易使用。
案例
比如现在有一个文件系统,它有很多的类,例如File,Directory,InputStream,OutputStream,ByteStream, NetworkAccess,Convertor等等,用这些类可以对文件进行打开,保存和转换,既可以在本地运行,也可以辅助NetworkAccess进行网络的存储和读取。用户在使用的时候不需要关系底层的实现,他只需要一个接口,提供了所需要的功能即可:
class File {
public:
const string& fileName() const;
ByteStream* data() const;
}
class NetworkAccess {
public:
void post(string url, ByteData* data);
ByteData* get(string url);
}
根据这两个类就可以进行相关的操作:
class NetworkFile {
public:
void saveFile(string url, string path);
File* loadFile(string url);
}
void NetworkFile::saveFile(string url, string path) {
Inputstream is(path);
NetworkAccess networkAccess;
networkAccess.put(url, is);
}
File* NetworkFile::loadFile(string url) {
NetworkAccess networkAccess;
ByteStream* data = networkAccess.get(url);
File* file = new File();
file.setName(getNameFromUrl(url));
file.setData(data);
return file;
}
适用性
- 当要为一个复杂的子系统提供一个简单的单接口时
- 为了让客户程序与实现之间不存在依赖性
- 当需要构建一个层次结构的子系统时,用Facade为每一层子系统定义一个入口点
优缺点
- Facade对用户屏蔽了子系统的组件,使用起来更方便。
- 降低了耦合度。
- 如果应用需要,可以直接使用子系统的类。