设计模式:外观模式 Facade

目录


前言

外观是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。


问题

假设你必须在代码中使用某个复杂的库或框架中的众多对象。正常情况下, 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确的顺序执行方法等。

最终, 程序中类的业务逻辑将与第三方类的实现细节紧密耦合,使得理解和维护代码的工作很难进行。

解决方案

外观类为包含许多活动部件的复杂子系统提供一个简单的接口。与直接调用子系统相比,外观提供的功能可能比较有限,但它却包含了客户端真正关心的功能。

如果你的程序需要与包含几十种功能的复杂库整合, 但只需使用其中非常少的功能,那么使用外观模式会非常方便。

例如,上传猫咪搞笑短视频到社交媒体网站的应用可能会用到专业的视频转换库,但它只需使用一个包含 encode(filename, format) 方法(以文件名与文件格式为参数进行编码的方法,其内部封装了调用专业库的具体实现)的类即可。 在创建这个类并将其连接到视频转换库后,你就拥有了自己的第一个外观。

结构

代码

cpp 复制代码
#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;
}
相关推荐
艾利克斯冰7 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
星心源七境12 小时前
七境体系全解析:从六韬兵法到AI锁颜,一套贯穿古典智慧与现代应用的成长操作系统
人工智能·设计模式·设计
qq_2975746713 小时前
设计模式系列文章(基础篇第21篇):迭代器模式——遍历聚合解耦,实现统一迭代访问
设计模式·迭代器模式
禅思院15 小时前
前端请求取消与调度完全指南:从 AbortController 到企业级优先级架构
前端·设计模式·前端框架
小bo波16 小时前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
写代码的小阿帆17 小时前
行为型设计模式之观察者(发布-订阅)模式
设计模式
王_teacher17 小时前
23种设计模式全解析(GoF 设计模式)
设计模式·软考·软件设计师·软考中级
阿坤带你走近大数据18 小时前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
geovindu19 小时前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式
Anastasiozzzz19 小时前
构建健壮软件系统的基石:深入解析面向对象设计七大原则
开发语言·javascript·设计模式·ecmascript