外观模式【结构型模式C++】

1.概述

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

2.结构  

  • 外观角色(Facade):为多个子系统对外提供一个共同的接口,知道哪些子系统负责处理请求,将客户端的请求转发给适当的子系统对象。
  • 附加外观 (Additional Facade): 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观(非必须,根据实际情况可选)。
  • 子系统角色(SubSystem):实现子系统的功能,处理外观角色指派的任务。客户可以通过外观角色访问它。子系统在整个系统中可以是一个或多个模块,每个模块都有若干类组成,这些类可能相互之间有着比较复杂的关系。
  • 客户角色(Client):调用外观角色访问各个子系统的功能

3.实现 

       外观模式模式不但重要,而且其应用也非常广泛,如在软件项目中,我们做多表数据更新时,业务逻辑层(Service层)数据访问层(DAO层)的调用可能包含多个步骤,除此之外还要进行事务处理,最终统一对外提供一个update()方法,如此一来上层(如控制器Controller层)便可一步调用。软件模块应该只专注于各自擅长的领域,合理明确的分工模式才能更好地整合与共享资源。这正是外观模式所解决的问题,其中外观门面类对子系统的整合与共享极大地保证了用户访问的便利性。

3.1 实例类比

      现在以电脑启动过程为例,以便进一步说明外观模式。为了用户使用方便,电脑开机按钮可以控制电脑所有硬件和系统软件的启动和关闭。如果没有开机按钮,我们(客户端)需要采用最原始的方式一步一步的操作HardDrive 类、Memory 类、Processor 类方法实现启动,采用外观模式即按钮Computer类中的方法,直接调用Operation方法即可完成电脑的启动

3.2 具体实现
#include <iostream>
#include <string>//子系统/子模块1
class HardDrive {
public:std::string Operation() const {return "HardDrive: Ready!\n";}// ...std::string ReadData() const {return "Guide loading startup data...\n";}
};//子系统/子模块2
class Memory {
public:std::string Operation() const {return "Memory: Ready!\n";}// ...std::string LoadOS() const {return "Load initialization system...\n";}
};//子系统/子模块3
class Processor {
public:std::string Start() const {return "Enter user usage mode...\n";}
};//外观角色 具体为电脑启动按钮或关闭
class Computer {
protected:HardDrive* hardDrive;Memory   * memory;Processor* processor;public:	Computer(HardDrive *hardDrive = nullptr,Memory *memory = nullptr,Processor* processor = nullptr) {this->hardDrive = hardDrive;this->memory = memory;this->processor = processor;}~Computer() {delete hardDrive;delete memory;delete processor;}std::string Operation() {std::string result = "computer is starting .....\n";result += this->hardDrive->Operation();result += this->memory->Operation();result += "computer orders model to perform the action:\n";result += this->hardDrive->ReadData();result += this->memory->LoadOS();result += this->processor->Start();return result;}
};//客户端
void ClientCode(Computer *facade) {// ...std::cout << facade->Operation();// ...
}int main() {HardDrive *hardDrive = new HardDrive;Memory *memory = new Memory;Processor* processor = new Processor;Computer *facade = new Computer(hardDrive, memory, processor);ClientCode(facade);delete facade;return 0;
}
3.3 运行结果

 

4.外观模式优缺点

优点:

  • 减少相互依赖:实现了子系统与客户之间的松耦合关系,子系统的组件变化不会影响到调用它的客户类,只需调整外观类即可。
  • 提高灵活性:对客户屏蔽子系统组件,减少了客户处理的对象数目,客户代码使用子系统使用起来更加容易。但并不妨碍客户直接访问子系统。
  • 提高安全性:更好地划分访问层次。
  • 遵循迪米特法则,即最少知道原则。

缺点:

  • 当增加子系统和扩展系统行为时,可能容易带来未知风险。
  • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
  • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
  • 某些情况下可能违背单一职责原则。

5 应用场景

  • 减少对子系统的依赖性
  • 子系统相对独立且越来越复杂,增加门面模式提供接口
  • 构建多层系统结构,利用门面对象作为每层的入口,简化层间调用

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

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

相关文章

链表与模拟LinkedList的实现

1. ArrayList的缺陷 ArrayList底层使用数组来存储元素 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后 搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低。因此ArrayList不适合做任意位…

【Redis 开发】缓存雪崩和缓存击穿

缓存问题 缓存雪崩解决方案 缓存击穿互斥锁逻辑时间基于互斥锁解决缓存击穿问题基于逻辑过期方式解决缓存击穿问题 缓存雪崩 缓存雪崩是指在同一时间段&#xff0c;大量的缓存key同时失效或者Redis服务器宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力 解决…

06_Scala流程控制

文章目录 [toc] 1.流程控制**小结&#xff1a;** **2. Scala中流程控制没有三元运算符****2.1 Scala中如果逻辑代码只有一行可以省略花括号****小结&#xff1a;** **3. 循环控制****3.1 for控制****3.2循环守卫 --> 循环表达式添加逻辑判断****3.3 循环步长 --> 表示循环…

Unreal Engine子类化系统UButton

UE系统Button点击事件无法传递参数&#xff0c;通过子类化系统Button添加自定义参数扩展实现Button点击事件参数传递点击C类文件夹&#xff0c;在右边的区域点击鼠标右键&#xff0c;在弹出的菜单中选择“新建C类”在弹出的菜单中选中“显示所有类”&#xff0c;选择Button作为…

架构师系统-Docker(四)-网络优化

网络优化 Docker网络原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关&#xff0c;…

数之寻软件怎么样?

数之寻软件是一款功能强大的数据恢复和备份软件&#xff0c;以下是对其特点和功能的详细评价&#xff1a; 一、数据恢复方面&#xff1a; 高效的数据恢复能力&#xff1a;数之寻软件采用了先进的算法和数据恢复技术&#xff0c;能够快速有效地恢复丢失或损坏的数据。无论是文…

RGB灯珠的控制-单片机通用模板

RGB灯珠的控制-单片机通用模板 一、RGB控制的原理二、RGB.c的实现三、RGB.h的实现四、color色彩空间变换以及控制渐变一、RGB控制的原理 ①通过IO发送脉冲识别0/1编码,组合24Bit的RGB数据,从而控制RGB;②每个RGB灯珠通过DIN、DOU进行级联起来;③通过HSV色彩转换成RGB从而控…

8点法估计基础矩阵

估计基础矩阵 文章目录 估计基础矩阵8点法归一化 8点法 8点法 根据两幅图像中8个对应点对之间的关系&#xff0c;采用SVD求 解最小二乘方 约束&#xff1a;det(F) 0 假设已知N对点的对应关系&#xff1a; { x i , x i ′ } i 1 N \{x_i,x^{\prime}_i\}_{i1}^N {xi​,xi′​…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中&#xff0c;我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径&#xff0c;但是锁着一次读取配置的增多&#xff0c;不可避免的出现了一个问题&#xff1a;我们如何来监控多个日志文件&#xff0c;这样原来的tailFile模块相对于当下场景就…

EasyRecovery数据恢复软件2025激活码及下载使用步骤教程

EasyRecovery数据恢复软件是一款功能强大且用户友好的数据恢复工具&#xff0c;专为帮助用户找回因各种原因丢失的数据而设计。该软件由全球知名的数据恢复技术公司开发&#xff0c;经过多年的技术积累和更新迭代&#xff0c;已经成为行业内备受推崇的数据恢复解决方案。 EasyR…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏&#xff1a;《体验AI》 期待您的点赞&#x1f44d;收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

AM解调 FPGA(寻找复刻电赛电赛D题的)

设计平台 Quartus II10.3mif产生工具modelsimSE &#xff08;仿真用&#xff09; DDS&#xff08;直接数字式频率合成器&#xff09; 从前面的内容可知&#xff0c;我们需要产生一个载波&#xff0c;并且在仿真时&#xff0c;我们还需要一个较低频率的正弦波信号来充当我们的…