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

server/2024/9/20 6:13:46/ 标签: 外观模式

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.ppmy.cn/server/18657.html

相关文章

中电金信:深度解析|数字化营销运营体系搭建

如何更好更快地梳理好体系搭建思路&#xff0c;稳步实现落地&#xff1f;下文将为大家明确搭建的推进步骤、执行要点&#xff0c;帮助商业银行理顺数字化营销运营体系的“点”“线”“面”~ 与所有转型的曲折、阵痛等特征一样&#xff0c;商业银行构建数字化营销运营体系过程中…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日&#xff0c;香港嘉实国际资产管理有限公司&#xff08;Harvest Global Investments&#xff09;今天宣布&#xff0c;得到香港证监会的原则上批准&#xff0c;将推出两大数字资产&#xff08;比特币及以太坊&#…

在 Quartz 的集群模式中,SchedulerThread线程多久会执行一次检查?

目录 引言 调度逻辑与时间计算 computeTimeToNextTrigger 方法 行为特点 引言 在 Quartz 的集群模式中&#xff0c;SchedulerThread 线程的执行频率取决于触发器的状态和计划时间。没有一个固定的时间间隔&#xff0c;因为线程需要适应当前调度器的任务需求。这个线程主要任…

【解决Android Studio】Could not resolve com.android.tools.build:gradle:7.4.1

【报错信息】 所用IDE为Android studio2022 1.1 Patch 1。 使用Android Studio新创建的新工程&#xff0c;在build过程中报了以下错误&#xff1a; A problem occurred configuring root project Application. > Could not resolve all files for configuration :classpat…

Kafka 3.x.x 入门到精通(04)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;04&#xff09;——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.5 存储消息2.5.1 存储组件2.5.2 数据存储2.5.2.1 ACKS校验2.5.2.2 内部主题校验2.5.2.3 ACKS应答及副本数量关系校验2.5.2.4 日志文…

简单的jmeter上传文件脚本

1、设置上传接口的headers的值 2、添加post请求

如何在Django中使用Ajax进行动态数据更新?

在Django中使用Ajax进行动态数据更新需要以下步骤&#xff1a; 在前端页面中引入jQuery库。 <script src"https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>创建一个处理Ajax请求的视图函数。 from django.http import Json…

工厂方法模式(模拟发奖多种商品)

目录 定义 模拟发奖多种商品 优惠券 实物商品 第三⽅爱奇艺兑换卡 代码实现 定义发奖接⼝ 实现奖品发放接⼝ 优惠券 实物商品 第三⽅兑换卡 创建商店⼯⼚ 测试验证 定义 在⽗类中提供⼀个创建对象的⽅法&#xff0c; 允许⼦类决定实例化对象的类型。 模拟发奖多…

每天一题crypto(8)---RSA(相邻素数)

题目&#xff1a; p getPrime(512) q gmpy2.next_prime(p) from Crypto.Util.number import * import gmpy2 flag bNSSCTF{******}p getPrime(512) q gmpy2.next_prime(p) n p*q e 65537 phi (p-1)*(q-1)m bytes_to_long(flag)c pow(m, e, n)print(fn {n}) print(f…

NEMU模拟器源码编译与使用

NEMU模拟器源码编译与使用 1 NEMU介绍2 NEMU编译3 NEMU使用3.1 下载MySBIBenOS3.2 使用riscv64-benos_defconfig编译NEMU3.3 编译MySBIBenOS3.4 运行MySBIBenOS 4 解决NEMU编译报错4.1 找不到readline/readline.h4.2 找不到path_manager.h 1 NEMU介绍 NEMU&#xff08;NJU Emu…

医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)

目录 手术风险评估表 一、患者基本信息 二、既往病史 三、手术相关信息 四、风险评估因素 五、风险评估结果 手术安全核查表 一、患者身份与手术信息核对 二、术前准备核查 三、手术团队与职责确认 四、手术物品与设备核查 五、术中关键步骤核查 六、术后核查 七…

DS进阶:AVL树和红黑树

一、AVL树 1.1 AVL树的概念 二叉搜索树&#xff08;BST&#xff09;虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-…

使用PyCharm开发工具创建工程

一. 简介 前面文章实现了开发 python程序使用的 开发工具PyCharm&#xff0c;本文来学习使用 PyCharm开发工具创建一个 python工程。 二. 使用PyCharm开发工具创建工程 1. 首先&#xff0c;打开 PyCharm开发工具&#xff0c;打开 "New project" 选项&#xff1a; …

二分搜索法

给定已经按照升序排好序的n个元素A[0,n-1]&#xff0c;现要在这n个元素中找出一特定元素x 1.此时数组A是排好序的&#xff0c;我们要根据二分法来找出x&#xff0c;先将数组分成两部分&#xff0c;数组的开始left,数组的结束right,中间位置为mid.此时数组的左边部分为A[left,m…

华为OD机试真题-找数字-2024年OD统一考试(C卷D卷)

题目描述: 小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数n (1<=n<=1e9),小扇需要找到一个比n大的数字m,使得m和n对应的二进制中1的个数要相同(如4对应二进制100,8对应二进制1000,1的个数都为1),现在求m的最小值。 输入描述: 输入:第一行输入一个正整数…

golang学习笔记——FAQ 1.22.2

Origins What is the purpose of the project? What is the history of the project? What’s the origin of the gopher mascot? Is the language called Go or Golang? Why did you create a new language? What are Go’s ancestors? What are the guiding pri…

DRF JWT认证进阶

JWT认证进阶 【0】准备工作 &#xff08;1&#xff09;模型准备 模型准备&#xff08;继承django的auth_user表&#xff09; from django.db import models from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):mobile models.CharField(ma…

2024新算法角蜥优化算法(HLOA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法角蜥优化算法&#xff08;HLOA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂…

【Java EE】 文件IO的使用以及流操作

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…