当前位置: 首页 > article >正文

10 外观(Facade)模式

外观模式

1.1 分类

(对象)结构型

1.2 提出问题

有一套复杂的视频系统,以及一套复杂的音频系统。希望简化使用流程,提供简化的操作面板。

1.3 解决方案

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。开放用户真正关心的功能。

1.4 实现类图

子系统类不会意识到外观的存在,它们在系统内运作并且相互之间可直接进行交互。
在这里插入图片描述

  1. 外观(Facade)提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求,知晓如何操作一切活动部件。
  2. 创建附加外观(Additional Facade)类可以避免多种不相关的功能污染单一外观,使其变成又一个复杂结构。客户端和其他外观都可使用附加外观。
  3. 复杂子系统(Complex Subsystem)由数十个不同对象构成。如果要用这些对象完成有意义的工作,你必须深入了解子系统的实现细节,比如按照正确顺序初始化对象和为其提供正确格式的数据。
  4. 客户端(Client)使用外观代替对子系统对象的直接调用。

1.5 示例代码

#include <iostream>
#include <string>

//子系统1
class VideoStstem {
public:
    std::string initial() const {
        return "视频系统:Ready!\n";
    }
    std::string play() const {
        return "视频系统:Go!\n";
    }
    //.....
    std::string operationX() const {
        return "视频系统:不常用的骚操作!\n";
    }
};
//子系统2
class RadioStstem {
public:
    std::string init() const {
        return "音频系统:就绪!\n";
    }
    std::string play() const {
        return "音频系统:播放!\n";
    }
    //.....
    std::string operationX() const {
        return "音频系统:不常用的骚操作!\n";
    }
    std::string mute() const {
        return "音频系统:静音!\n";
    }
};
//外观
class Controller {
protected:
    VideoStstem* m_video;
    RadioStstem* m_radio;
public:
    Controller(VideoStstem* video = nullptr,
        RadioStstem* radio = nullptr) {
        if (!video) m_video = video;
        else new VideoStstem;

        m_radio = radio ? radio : new RadioStstem;
    }
    ~Controller() {
        delete m_video;
        delete m_radio;
    }
    std::string start() {
        std::string string = "控制器启动系统:\n";
        string += m_video->initial();
        string += m_radio->init();
        string += "控制器播放;\n";
        string += m_video->play();
        string += m_radio->play();
        return string;
    }
    std::string mute() {
        return m_radio->mute();
    }
};
int main()
{
    VideoStstem* video = new VideoStstem;
    RadioStstem* radio = new RadioStstem;
    Controller controller(video, radio);//外观对象,负责回收子系统
    std::cout << controller.start();
}

1.6 举个栗子

使用单个外观类隔离多重依赖,简化了客户端与复杂视频转换框架之间的交互。
在这里插入图片描述

1.7 总结

  1. 优点:可以让自己的代码独立于复杂子系统。
  2. 缺点:外观可能成为与程序中所有类都耦合的上帝对象。

http://www.kler.cn/a/521318.html

相关文章:

  • 基于先验领域知识的归纳式多实例多标签学习用于牙周病分类| 文献速递 -医学影像人工智能进展
  • 【Django DRF Apps】【文件上传】【断点上传】从零搭建一个普通文件上传,断点续传的App应用
  • 游戏策划的分类
  • 性能测试丨JVM 性能数据采集
  • 【2024年华为OD机试】 (C卷,100分)- 爱吃蟠桃的孙悟空(JavaScriptJava PythonC/C++)
  • SpringSecurity相关面试试题及答案解析
  • Flutter解决macbook M芯片Android Studio中不显示IOS真机的问题
  • 【漫话机器学习系列】062.向前逐步选择法(Forward Stepwise Selection)
  • Django网站搭建流程
  • “破冰”探索两周年,AI和媒体碰撞出了什么火花?
  • 第二十一周:Mask R-CNN
  • 数据结构--树
  • 深入解析 VPN、URL 和堡垒机的原理与应用
  • 小偷之打家劫舍
  • /opt安装软件,就可以使用man xx命令是为什么
  • webview_flutter_wkwebview 3.17.0使用指南
  • Vue2 项目目录说明与配置
  • ubuntu解决普通用户无法进入root
  • 高级IO__
  • wx041基于springboot+vue+uniapp的美术馆预约平台小程序