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

设计模式之外观设计模式

一、外观设计模式概念

外观模式 (Facade) 是一种结构型设计模式, 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • 外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
  • 外观模式实现了子系统与客户之间的松耦合关系。
  • 外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。
  • 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。
  • 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
  • 如果需要将子系统组织为多层结构, 可以使用外观。

外观设计模式的结构

  1. 外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。

  2. 创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。

  3. 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。

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

  4. 客户端 (Client) 使用外观代替对子系统对象的直接调用。

代码如下:

    问题:有一套复杂的视频系统,以及以太复杂的音频系统。希望简化使用流程,提供简化的操作面板。
    解决方案:为子系统中的一组接口提供一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

#include <iostream>
#include <string>
//子系统1
class VedioSystem {
public:std::string initial()const{return "视频系统:Ready!\n";}std::string play()const{return "视频系统:Go!\n";}std::string operationX()const{return "视频系统:不常用的操作!\n";}};
//子系统2
class RadioSystem {
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:VedioSystem* m_vedio;RadioSystem* m_radio;
public:Controller(VedioSystem* vedio = nullptr, RadioSystem* radio = nullptr){if (!vedio){m_vedio = vedio;}else{new VedioSystem();m_radio = radio ? radio : new RadioSystem();}}~Controller(){delete m_vedio;}std::string start()const{std::string string = "控制器启动视频系统\n";string += m_vedio->initial();string += m_radio->init();string += "控制器启动播放\n";string += m_vedio->play();string += m_radio->play();return string;}std::string mute()const{return "控制器静音\n" + m_radio->mute();}
};
int main()
{VedioSystem* vedio = new VedioSystem();RadioSystem* radio = new RadioSystem();Controller controller(vedio, radio);std::cout << controller.start() << std::endl;return 0;
}

 二、与其他模式的关系

  • 外观模式 (opens new window)为现有对象定义了一个新接口, 适配器模式 (opens new window)则会试图运用已有的接口。 适配器通常只封装一个对象, 外观通常会作用于整个对象子系统上。
  • 当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂模式 (opens new window)来代替外观 (opens new window)。
  • 享元模式 (opens new window)展示了如何生成大量的小型对象, 外观 (opens new window)则展示了如何用一个对象来代表整个子系统。
  • 外观 (opens new window)和中介者模式 (opens new window)的职责类似: 它们都尝试在大量紧密耦合的类中组织起合作。
    • 外观为子系统中的所有对象定义了一个简单接口, 但是它不提供任何新功能。 子系统本身不会意识到外观的存在。 子系统中的对象可以直接进行交流。
    • 中介者将系统中组件的沟通行为中心化。 各组件只知道中介者对象, 无法直接相互交流。
  • 外观 (opens new window)类通常可以转换为单例模式 (opens new window)类, 因为在大部分情况下一个外观对象就足够了。
  • 外观 (opens new window)与代理模式 (opens new window)的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。 代理与其服务对象遵循同一接口, 使得自己和服务对象可以互换, 在这一点上它与外观不同。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于菜鸟教程的flask学习记录 —— Flask视图函数
  • 零基础考过软考信息系统项目管理师经验分享
  • saltstack高级用法
  • MATLAB基础:5脚本与函数
  • 鸿萌数据恢复服务:Synology Hybrid RAID 的容错、优势和数据恢复
  • 【Java算法】二叉树的深搜
  • 数据结构修炼——顺序表和链表的区别与联系
  • 【目标检测】labelimg图像标注软件的使用流程
  • Vue3:reactive丢失响应式,数据有更新但表单没有更新
  • 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
  • Python模块和包:标准库模块(os, sys, datetime, math等)②
  • 邮件营销:助力企业转换客户,提升曝光率
  • Redis实践之缓存:设置缓存过期策略
  • web基础+http协议+httpd详细配置
  • docker中图形化界面的转发
  • 自己简单写的 事件订阅机制
  • C++类的相互关联
  • git 常用命令
  • JavaScript 一些 DOM 的知识点
  • Java应用性能调优
  • LeetCode18.四数之和 JavaScript
  • Octave 入门
  • Vue组件定义
  • 从PHP迁移至Golang - 基础篇
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端性能优化--懒加载和预加载
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 删除表内多余的重复数据
  • 我有几个粽子,和一个故事
  • 学习HTTP相关知识笔记
  • 一些css基础学习笔记
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​如何使用QGIS制作三维建筑
  • #每天一道面试题# 什么是MySQL的回表查询
  • (02)vite环境变量配置
  • (floyd+补集) poj 3275
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (每日一问)基础知识:堆与栈的区别
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)Linux Shell编程——输入输出重定向
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .form文件_一篇文章学会文件上传
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Core中的去虚
  • .Net FrameWork总结