新的类型,这一类型有 4 种,我们慢慢看。
1. 情景与意图
假设我们要提供一个某一个功能的SDK,比如语音处理相关的,合成,解析等等。在别人使用的时候应该是使用我们提供的接口,而不应该直接使用我们内部的细节方法。
在日常开发中,总会发生一些组件或者程序的调用方与组件或程序的子模块发生耦合,这样的设计就违法了面向对象的依赖倒置原则与接口隔离原则。
于是,门面设计模式应运而生。
2. 门面模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
门面模式相对还是比较好理解的,下面我们用一个例子来理解一下。
3. 第三方工具
我们现在实现一个第三方工具,包括网络请求,下载,文件处理等等。但是不要让用户直接使用我们具体的类,而是应该提供接口。
首先我们需要实现网络和文件相关的服务:
struct DPError {
std::string _errorCode;
std::string _errorMessage;
};
struct DPResponse {
};
struct DPRequest {
};
typedef void(*networkCompleteCallBack)(DPError* error, DPResponse* response);
class DPNetworkManager {
public:
static DPNetworkManager sharedInstance();
void postRequest(DPRequest* request, networkCompleteCallBack callBack);
void getRequest(DPRequest* request, networkCompleteCallBack callBack);
void download(DPRequest* request, std::string url, std::string destPath, networkCompleteCallBack callBack);
};
class DPFileService {
// 不再细说
};
此时不应该让用户直接使用我们manager或者fileservice,我们应该定义一个抽象接口类:
// .h
class DPUtility {
public:
static void postRequest(DPRequest* request, networkCompleteCallBack callBack);
static void getRequest(DPRequest* request, networkCompleteCallBack callBack);
static void download(DPRequest* request, std::string url, std::string destPath, networkCompleteCallBack callBack);
};
// .cpp
// 我们自己内部调用
void DPUtility::postRequest(DPRequest* request, networkCompleteCallBack callBack) {
DPNetworkManager::sharedInstance().postRequest(request, callBack);
}
void DPUtility::getRequest(DPRequest * request, networkCompleteCallBack callBack) {
DPNetworkManager::sharedInstance().getRequest(request, callBack);
}
void DPUtility::download(DPRequest* request, std::string url, std::string destPath, networkCompleteCallBack callBack) {
DPNetworkManager::sharedInstance().download(request, url, destPath, callBack);
}
4. 总结
其实门面模式在大的范围内其实应该算是一个架构模式,而不是设计模式。设计模式在翻译的时候可能为了体现高大上,其实23中设计模式,应该叫23中设计技巧,或者设计规范,在工程小的范围内使用以构建优美而健壮的代码。
而设计一个架构呢,也需要模式,门面模式,MVC等等都可以是。
最后注意一点就是:门面模式达到了与外部客户的解耦,但是其并不是一个集装箱,把所有的对象和逻辑都塞在里面,我们还应该注意内部的耦合。
门面设计模式代码:【门面设计模式C++源码】