C++设计模式:门面模式(十二)

1、概念与定义
  • “接口隔离”模式:在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。

  • 门面设计模式定义:为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。

  • 动机:

    • 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的烟花,这种过多的耦合面临很多变化的挑战。
    • 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的烟花和内部子系统的变化之间的依赖相互解耦?
2、举例分析

在这里插入图片描述

  • 个人觉得门面设计模式是一个架构层次的设计模式,并不是一个面向对象的设计模式。

  • 门面设计模式提倡:

    • 首先是接口隔离:C++中可能不太常见,写过Java程序的就知道JDBC操纵数据库是一个泛泛概念,JDBC封装了MySQL、Oracle…等数据库的操纵方式。
      • 虽然JDBC封装了很多种数据库的访问,但是它们的访问接口是统一的。这就意味着它采用了B方案,只是通过反射加载的驱动不一样,可以加载oracle、mysql的驱动,但是调用的函数api是完全一致的,这就是一个完美的接口隔离
    • 其次提倡高内聚与低耦合:高内聚的含义是Facade内部是一个高内聚的,模块与模块之间是高度内聚的存在,而对外的模块与Facade之间是一个低耦合的,因为对外的模块只需要通过Facade统一接口去操纵即可。
  • 再比如电脑:

    • 任何电脑都提供了USB、显示器、网线的接口给使用者使用,这其实就是一种门面模式,接口统一,至于我用USB连接鼠标还是连接U盘内部进行处理,反正对外就是一个统一的USB接口,机箱内部用什么主板、什么显卡、什么内存条等等都与对外的接口隔离。
3、总结
  • 从客户程序的角度来看,Facade模式简化了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一种“解耦”的效果——内部子系统的任何变化都不会影响到Facade接口的变化。

  • Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。

  • Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”(高内聚),而不是一个简单的功能集合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明:https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

低空经济再火,通过了解飞行汽车产业链与核心技术,我发现了汽车行业从业者新的机会!

低空经济最近又一次成为资本市场热议的话题,同时在两会报告中大篇幅的写入低空经济,并将其定义成为“新质生产力的代表”,低空经济是什么?与我们此前所聊过的飞行汽车之间又有什么样子的联系?我们作为汽车行业的从业者…

Unity笔记之Android打包、减小包体之类的问题

打包问题 问题1: 一般大部分问题就是JDK、SDK、NDK之类的问题。现在是其他的问题,之前遇到过,好久没玩android了都忘了。 这试了半天,结果是需要有密钥库。那就给他创建一个填一下就行了 (在网上看了半天&#xff…

Android 加密之 打包为arr 项目依赖或者为jar

Android 加密之 打包为arr 项目依赖或者为jar 1. 修改build.gradle plugins {//id com.android.application// 1. 修改为libraryid com.android.library }android {namespace com.dzq.iccid2compileSdk 33defaultConfig {//applicationId "com.dzq.iccid2"// 2. 注…

【数据结构】05树

树 树1.2 结点的分类1.3 结点间的关系1.4 树的其他概念1.5 树的性质 2. 二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树(二叉查找树) 3. 二叉树的存储结构3.1 二叉树顺序存储结构3.2 二叉树的链式存储结构 4. 二叉树的遍历4.1 层次遍历4.1 前序遍历4.2…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请,之前是云翼计划学生服务器9元/月,现在是高校计划,学生服务器可以免费申请,先完成学生认证即可免费领取一台云服务器ECS,配置为2核2G、1M带宽、40G系统盘,在云服务器ECS实例过期之…

Elasticsearch初步了解学习记录

目录 前言 一、ElasticSearch是什么? 二、使用步骤(python版) 1.引入包 2.连接数据库 3.创建索引 4.写入数据 5.查询数据 三、相关工具介绍 1.ES浏览器插件 总结 前言 随着数据量的不断增加,传统的查询检索在速度上遇…

IO——文件IO

1.1 概念 又称为系统IO,是系统调用,是操作系统提供的函数接口。 posix中定义的一组用于输入输出的函数。 1.2 特点 (1)没有缓冲机制,效率较低 (2)围绕文件标识符操作,非负整数,依次分配 (3) 文件IO默认打开了三个文…

正则表达式:量词(三)

正则表达式中的量词有以下几种:1. *: 匹配前面的字符0次或多次。2. : 匹配前面的字符1次或多次。3.?: 匹配前面的字符0次或1次。4. {n}: 匹配前面的字符恰好n次。5. {n,}: 匹配前面的字符至少n次。6. {n,m}:匹配前面的字符至少n次,但不超过m次。 以下是使用Python的…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”,子网掩码为“255.255.255.128”,网关为“192.168.班内学号.1”;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先,从名字上看,这两个注解意义特别接近,AutoConfigurationPackage 就是自动配置包,自动配置包的目的是能让系统扫描到包内的 Bean;ComponentScan 则是组件扫描,这个松哥在之前的教程中也多次提到过了&…

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA(Visual Basic for Applications) 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…

Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

738. 单调递增的数字 总体思想就是从后往前遍历,比较第i位和第i1位的大小,不符合顺序char[i]减1,i1位填9,找到需要填9的最先位置,然后填9。 class Solution {public int monotoneIncreasingDigits(int n) {String s …

win 安装 Stable Diffusion

注:本人使用的是 RTX2060 - 6G版 特别提醒:安装一定要 CUDA 和 PyTorch 版本能配套用,不然会有生成保存问题(我是这样的),装完用 python -m xformers.info 这个看对应的版本 建议:有些命令安装在venv 虚拟机中做&…

【Go实现】实践GoF的23种设计模式:桥接模式

上一篇:【Go实现】实践GoF的23种设计模式:解释器模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 GoF 对桥接模式(Bridge Patt…

Android13 CameraServer启动流程

代码入口 frameworks/av/camera/cameraserver 里面包含了四个文件 我们先来看看Android.bp的内容 package {// See: http://go/android-license-faq// A large-scale-change added default_applicable_licenses to import// all of the license_kinds from "frameworks_a…

Flutter第七弹 网格列表GridView

1) Flutter提供了网格列表,怎么设置列数? 2)怎么初始化每个列表项Item? 一、GridView简介 Flutter也存在网格列表组建GridView,用于展示多行多列的列表。 1.1 GridView构建 采用GridView.count() 进行构建 1.2 Gr…

服务器代理

服务器代理 配置:64G内存1 3090(24g)1P4000(8g) SSH连接 工作路径:/home/ubuntu/workspace/python Anaconda路径:/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…

数据采集仪:自动化监测系统的核心组件

在当代的工业自动化领域,数据采集仪成为了一个关键的技术工具,它不仅仅是简单地将电信号转化为数据信号,而是能够实时、有效地处理和显示各种信号,确保整个监测系统的稳定、高效运行。 点击输入图片描述(最多30字&…

【微信小程序】canvas开发笔记

【微信小程序】canvasToTempFilePath:fail fail canvas is empty 看说明书 最好是先看一下官方文档点此前往 如果是canvas 2d 写canvas: this.canvas,,如果是旧版写canvasId: ***, 解决问题 修改对应的代码,如下所示,然后再试试运行&#x…