目錄
- 前言
- 問題
- 解決方案
- 結構
- 代碼
前言
外觀是一種結構型設計模式,能為程序庫、框架或其他復雜類提供一個簡單的接口。
問題
假設你必須在代碼中使用某個復雜的庫或框架中的眾多對象。正常情況下, 你需要負責所有對象的初始化工作、 管理其依賴關系并按正確的順序執行方法等。
最終, 程序中類的業務邏輯將與第三方類的實現細節緊密耦合,使得理解和維護代碼的工作很難進行。
解決方案
外觀類為包含許多活動部件的復雜子系統提供一個簡單的接口。與直接調用子系統相比,外觀提供的功能可能比較有限,但它卻包含了客戶端真正關心的功能。
如果你的程序需要與包含幾十種功能的復雜庫整合, 但只需使用其中非常少的功能,那么使用外觀模式會非常方便。
例如,上傳貓咪搞笑短視頻到社交媒體網站的應用可能會用到專業的視頻轉換庫,但它只需使用一個包含 encode(filename, format) 方法(以文件名與文件格式為參數進行編碼的方法,其內部封裝了調用專業庫的具體實現)的類即可。 在創建這個類并將其連接到視頻轉換庫后,你就擁有了自己的第一個外觀。
結構
代碼
#include <iostream>
#include <string>
#include <memory>
using namespace std;// 復雜子系統:視頻格式解析器
class VideoParser {
public:void parse(const string& filename) {cout << "解析視頻文件: " << filename << endl;}
};// 復雜子系統:視頻編碼器
class VideoEncoder {
public:void encode(const string& format) {cout << "將視頻編碼為 " << format << " 格式" << endl;}
};// 復雜子系統:視頻壓縮器
class VideoCompressor {
public:void compress(int quality) {cout << "壓縮視頻,質量等級: " << quality << endl;}
};// 其他庫里面的類
// ......// 外觀類:提供簡單的視頻轉換接口
class VideoConverterFacade {
private:// 外觀類包含復雜子系統的智能指針shared_ptr<VideoParser> parser;shared_ptr<VideoEncoder> encoder;shared_ptr<VideoCompressor> compressor;public:VideoConverterFacade(){parser=make_shared<VideoParser>();encoder=make_shared<VideoEncoder>();compressor=make_shared<VideoCompressor>();}// 簡化的接口:轉換視頻格式void convert(const string& filename, const string& format) {cout << "開始視頻轉換..." << endl;// 內部處理復雜的子系統交互parser->parse(filename);encoder->encode(format);compressor->compress(80); // 使用默認質量std::cout << "視頻轉換完成!" << std::endl;}
};int main(){auto facade=make_shared<VideoConverterFacade>();facade->convert("666.mp4","mp4");return 0;
}