5分钟上手Trilogy:嵌入式MySQL客户端库快速开始教程
2026/7/5 15:47:10
为一个复杂子系统提供一个简洁、高层接口,隐藏内部的复杂性,让客户端“一键启动”或“一键操作”整个系统。
你家智能家居系统:
客户端(手机App)不想一个个调用:
light.on();ac.setTemp(24);curtain.open();security.arm();sound.play("夜曲");外观模式直接给一个按钮:
homeFacade.goodNightMode();// 一键全搞定!不用外观,客户端代码会变成这样:
// 客户端直接依赖一堆子系统,耦合到吐cpu.start();memory.allocate();disk.mount();network.connect();database.open();logger.init();// 明天子系统改一个接口?所有客户端全修!寄!| 项目 | 桥接(Bridge) | 组合(Composite) | 装饰器(Decorator) | 外观(Facade) |
|---|---|---|---|---|
| 核心意图 | 两个维度独立扩展 | 部分-整体统一接口(树) | 动态叠加职责 | 简化复杂子系统接口 |
| 结构 | 持有一个桥指针 | 持有多个孩子 | 持有一个包装对象 | 持有多个子系统指针 |
| 客户端看到 | 正常接口 | 统一树接口 | 原接口不变 | 极简接口 |
| 典型场景 | 抽象 vs 实现分离 | UI树、文件系统 | 流加密/压缩/日志 | 编译器、音视频编码、家居控制 |
| 口号 | “横向插拔” | “套娃统一” | “层层叠加” | “一键搞定复杂” |
真实场景:一个视频转码库内部超级复杂(解复用、解码、滤镜、编码、复用),但对外只想提供“convert(input, output)”一个接口。
#include<iostream>#include<memory>#include<string>usingnamespacestd;// ────── 复杂子系统(真实项目里这些类超级复杂) ──────classDemuxer{public:voidopen(conststring&file){cout<<"[Demuxer] 打开文件并分离音视频流\n";}voidreadPacket(){cout<<"[Demuxer] 读取一个packet\n";}};classDecoder{public:voidinit(){cout<<"[Decoder] 初始化解码器 (H264/AVC)\n";}voiddecode(){cout<<"[Decoder] 解码一帧视频\n";}};classFilter{public:voidaddWatermark(){cout<<"[Filter] 添加水印滤镜\n";}voidresize(){cout<<"[Filter] 调整分辨率到1080p\n";}};classEncoder{public:voidinit(){cout<<"[Encoder] 初始化H265编码器\n";}voidencode(){cout<<"[Encoder] 编码一帧\n";}};classMuxer{public:voidopenOutput(conststring&file){cout<<"[Muxer] 打开输出文件\n";}voidwritePacket(){cout<<"[Muxer] 写入封装\n";}voidclose(){cout<<"[Muxer] 完成封装\n";}};// ────── 外观(Facade)—— 一键转码! ──────classVideoConverterFacade{unique_ptr<Demuxer>demuxer;unique_ptr<Decoder>decoder;unique_ptr<Filter>filter;unique_ptr<Encoder>encoder;unique_ptr<Muxer>muxer;public:VideoConverterFacade(){demuxer=make_unique<Demuxer>();decoder=make_unique<Decoder>();filter=make_unique<Filter>();encoder=make_unique<Encoder>();muxer=make_unique<Muxer>();}// 客户端唯一需要调的接口!voidconvert(conststring&inputFile,conststring&outputFile){cout<<"=== 开始视频转码 ===\n";demuxer->open(inputFile);decoder->init();filter->addWatermark();filter->resize();encoder->init();muxer->openOutput(outputFile);// 模拟处理过程(真实会循环)for(inti=0;i<3;++i){demuxer->readPacket();decoder->decode();encoder->encode();muxer->writePacket();}muxer->close();cout<<"=== 转码完成!输出: "<<outputFile<<" ===\n";}};intmain(){VideoConverterFacade converter;// 客户端只用这一行!完全不知道内部有多复杂converter.convert("input.mp4","output_hevc.mp4");}输出:
=== 开始视频转码 === [Demuxer] 打开文件并分离音视频流 [Decoder] 初始化解码器 (H264/AVC) [Filter] 添加水印滤镜 [Filter] 调整分辨率到1080p [Encoder] 初始化H265编码器 [Muxer] 打开输出文件 [Demuxer] 读取一个packet [Decoder] 解码一帧视频 [Encoder] 编码一帧 [Muxer] 写入封装 ... (循环) [Muxer] 完成封装 === 转码完成!输出: output_hevc.mp4 ===“子系统复杂别害怕,外观一键都搞定;
客户端爽到起飞,内部改动不扩散!”
当你面对一个“由多个复杂子系统组成的大功能”,客户端却只想“一键完成”时,
立刻上外观模式——包一层简洁接口,隐藏所有地狱细节!
现在,外观模式彻底说透了!