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

ops/2024/10/21 6:03:53/

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/ops/25406.html

相关文章

再谈“协议”

1.认识协议 之前我们使用TCP的方式实现了一个服务器&#xff0c;而TCP是面向字节流的&#xff0c;而UDP是面向数据报的&#xff0c;接下来通过一个例子区分两种的区别。 UDP面向数据报&#xff1a;就如同发快递&#xff0c;你发多少个快递&#xff0c;对面就收到多少个快递&am…

(学习日记)2024.04.29:UCOSIII第五十三节:User文件夹函数概览(uC-LIB文件夹)第三部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。 这…

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目&#xff0c;要装jdk类似。rabbitMQ是基于Erlang开发的&#xff0c;因此安装rabbitMQ服务器之前&#xff0c;需要先安装Erlang环境。 官网直接下载windows直装版本&#xff1a;https://www.erlang.org/downloads 无脑安装&a…

【网站项目】个人需求和地域特色的外卖推荐系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

深入理解Java消息中间件-性能优化和调优

性能优化和调优是构建高性能系统的重要环节&#xff0c;这对于Apache Kafka这样的消息中间件尤为重要。下面我们将介绍一些具体的性能优化和调优操作方式&#xff0c;以帮助你更好地利用Kafka来构建高性能的消息系统。 合理配置Kafka集群&#xff1a;合理配置Kafka集群的节点数…

同一用户使用多个用户名对服务器或共享资源进行多个连接不允许

异常&#xff1a;使用 net use 指令 访问远程目录&#xff0c;提示错误 “同一用户使用多个用户名对服务器或共享资源进行多个连接 不允许。断开之前与服务器或共享资源的所有连接&#xff0c;然后 请再试一次。” 分析&#xff1a; 分析这可能是多个用户 请求这个目录&#x…

【QEMU系统分析之实例篇(六)】

系列文章目录 第六章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第六章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.目标机器创建过程3.static void pc_machine_initfn(Object *o…

什么是scrum中的3355?

&#xff08;学校作业&#xff09; Scrum中的3355是指Scrum框架中的三个核心角色、三个工件、五个关键事件和五个价值观。 三个核心角色包括&#xff1a; 产品负责人&#xff08;Product Owner&#xff09;&#xff1a;主要负责确定产品的功能和达到要求的标准&#xff0c;指…