2026/2/6 1:17:49
网站建设
项目流程
网站建设费要交印花税吗,定西网页设计,什么行业最需要做网站建设,聚名网平台设计模式[10]——外观模式#xff08;Facade#xff09;一分钟彻底说透#xff08;C版软件领域真实例子#xff09;
一句话定义
为一个复杂子系统提供一个简洁、高层接口#xff0c;隐藏内部的复杂性#xff0c;让客户端“一键启动”或“一键操作”整个系统。
最狠的比喻…设计模式[10]——外观模式Facade一分钟彻底说透C版·软件领域真实例子一句话定义为一个复杂子系统提供一个简洁、高层接口隐藏内部的复杂性让客户端“一键启动”或“一键操作”整个系统。最狠的比喻软件人专属你家智能家居系统有灯、空调、窗帘、安防、音响等十几个子模块每个模块都有自己的复杂 API开/关/调温/调光/播放列表……客户端手机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();// 明天子系统改一个接口所有客户端全修寄和之前模式彻底分清10秒表项目桥接Bridge组合Composite装饰器Decorator外观Facade核心意图两个维度独立扩展部分-整体统一接口树动态叠加职责简化复杂子系统接口结构持有一个桥指针持有多个孩子持有一个包装对象持有多个子系统指针客户端看到正常接口统一树接口原接口不变极简接口典型场景抽象 vs 实现分离UI树、文件系统流加密/压缩/日志编译器、音视频编码、家居控制口号“横向插拔”“套娃统一”“层层叠加”“一键搞定复杂”真实软件例子视频编码器子系统FFmpeg风格真实场景一个视频转码库内部超级复杂解复用、解码、滤镜、编码、复用但对外只想提供“convert(input, output)”一个接口。#includeiostream#includememory#includestringusingnamespacestd;// ────── 复杂子系统真实项目里这些类超级复杂 ──────classDemuxer{public:voidopen(conststringfile){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(conststringfile){cout[Muxer] 打开输出文件\n;}voidwritePacket(){cout[Muxer] 写入封装\n;}voidclose(){cout[Muxer] 完成封装\n;}};// ────── 外观Facade—— 一键转码 ──────classVideoConverterFacade{unique_ptrDemuxerdemuxer;unique_ptrDecoderdecoder;unique_ptrFilterfilter;unique_ptrEncoderencoder;unique_ptrMuxermuxer;public:VideoConverterFacade(){demuxermake_uniqueDemuxer();decodermake_uniqueDecoder();filtermake_uniqueFilter();encodermake_uniqueEncoder();muxermake_uniqueMuxer();}// 客户端唯一需要调的接口voidconvert(conststringinputFile,conststringoutputFile){cout 开始视频转码 \n;demuxer-open(inputFile);decoder-init();filter-addWatermark();filter-resize();encoder-init();muxer-openOutput(outputFile);// 模拟处理过程真实会循环for(inti0;i3;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 C 真实项目里无处不在编译器clang::CompilerInstance外观 → 隐藏 Preprocessor/Lexer/Parser/Sema/CodeGen 等十几个模块数据库连接库一个 Connection 对象 → 隐藏连接池、事务、语句准备等游戏引擎启动Engine::start() → 初始化渲染、物理、音频、输入、网络等子系统FFmpegavformat_open_input avcodec_find_decoder … → 很多人自己包一层 FacadeQtQApplication → 隐藏事件循环、窗口系统、插件等终极口诀程序员专属“子系统复杂别害怕外观一键都搞定客户端爽到起飞内部改动不扩散”刻在DNA里的一句话当你面对一个“由多个复杂子系统组成的大功能”客户端却只想“一键完成”时立刻上外观模式——包一层简洁接口隐藏所有地狱细节现在外观模式彻底说透了