(二)结构型模式:6、外观模式(Facade Pattern)(C++实例)

news2024/12/23 3:24:40

目录

1、外观模式(Facade Pattern)含义

2、外观模式的UML图学习

3、外观模式的应用场景

4、外观模式的优缺点

5、C++实现外观模式的简单实例


1、外观模式(Facade Pattern)含义

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

(1)外观模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端更容易使用子系统。

(2)外观模式的核心思想是通过创建一个外观类(也称为门面类),将客户端与子系统解耦,客户端只需要通过外观类来与子系统进行交互,而不需要直接调用子系统的接口。

2、外观模式的UML图学习

在外观模式中,有以下几个关键角色:

 (1)外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,用于访问子系统中的一组接口。外观类封装了对子系统的调用,隐藏了子系统的复杂性,为客户端提供了一个简单的接口。

(2)子系统(Subsystem):子系统是实现具体功能的一组类或模块。每个子系统都有自己的一组接口和实现逻辑。子系统可以是一个或多个类的集合。

(3)客户端(Client):客户端通过外观类来与子系统进行交互。客户端不需要直接调用子系统的接口,而是通过外观类提供的简单接口来完成操作。

在外观模式中,外观类充当了客户端与子系统之间的中介,它将客户端的请求转发给子系统,并将子系统的结果返回给客户端。这样,客户端只需要与外观类进行交互,而无需了解子系统的具体实现细节。

外观模式的目的是简化客户端与子系统之间的交互,降低耦合度,提高系统的可维护性和可扩展性。

3、外观模式的应用场景

(1)当需要简化复杂子系统的接口并提供一个统一的接口时。

(2)当需要将客户端与子系统解耦,以降低客户端与子系统之间的依赖性时。

(3)当需要对子系统进行封装,隐藏其复杂性,提高系统的易用性和可维护性时。

4、外观模式的优缺点

(1)优点:

1)简化接口:外观模式提供了一个简单的接口,隐藏了子系统的复杂性。客户端只需要与外观类进行交互,无需了解子系统的具体实现细节,从而简化了客户端的调用过程。

2)解耦子系统和客户端:外观模式将客户端与子系统之间的依赖关系解耦,使得它们可以独立演化。当子系统发生变化时,只需要调整外观类即可,而不会影响到客户端。

3)提高可维护性:外观模式将复杂的子系统封装在一个外观类中,使得系统结构更加清晰,易于理解和维护。对于客户端来说,只需要关注外观类的接口,而不需要关心子系统的具体实现。

4)提高代码复用性:外观模式可以将一些常用的操作封装在外观类中,供多个客户端共享使用,从而提高了代码的复用性。

(2)缺点:

1)不符合开闭原则:当需要新增或修改子系统的功能时,可能需要修改外观类的代码。这违反了开闭原则,可能会导致外观类的修改引起其他客户端的不稳定。

2)可能引入性能问题:外观模式可能会引入一层间接调用,导致系统性能下降。因此,在设计时需要权衡系统的性能和代码结构的清晰度。

3)可能增加系统复杂性:如果一个系统本身就很简单,使用外观模式可能会增加不必要的复杂性,使得代码变得冗余。

总体来说,外观模式是一种有用的设计模式,可以提供简化的接口,解耦子系统和客户端,并提高系统的可维护性和可扩展性。但在使用时需要注意遵循设计原则,权衡好代码的灵活性、性能和复杂性。

5、C++实现外观模式的简单实例


#include <iostream>

// 子系统A
class SubsystemA
{
public:
    void operationA() 
    {
        std::cout << "Subsystem A operation" << std::endl;
    }
};

// 子系统B
class SubsystemB 
{
public:
    void operationB() 
    {
        std::cout << "Subsystem B operation" << std::endl;
    }
};

// 外观类
class Facade 
{
private:
    SubsystemA subsystemA;
    SubsystemB subsystemB;

public:
    void operation() 
    {
        subsystemA.operationA();
        subsystemB.operationB();
    }
};

int main() 
{
    // 创建外观对象
    Facade facade;

    // 调用外观对象的操作方法
    facade.operation();

    return 0;
}

在上述示例中,我们定义了两个子系统类 SubsystemA 和 SubsystemB,分别具有自己的操作方法 operationA 和 operationB。

然后,我们创建了一个外观类 Facade,该类持有 SubsystemA 和 SubsystemB 的实例,并提供了一个操作方法 operation,该方法内部调用了子系统的操作方法。

在 main 函数中,我们创建了一个外观对象 facade,并通过调用 facade.operation() 来间接访问子系统的功能。

运行以上代码,输出将会是:

Subsystem A operation

Subsystem B operation

可以看到,通过外观模式,我们可以通过简单的接口来访问复杂的子系统功能,而无需直接与子系统进行交互。

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

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

相关文章

气象监测设备——分类与应用

气象监测设备多种多样&#xff0c;不同的应用场景选择适合的气象监测设备才能事半功倍。 在植保站中&#xff0c;可以 选择农林植保小气候气象站&#xff0c;它可以帮助植保站的工作人员完成气象监测工作&#xff0c;对天气环境进行预报预测&#xff0c;为植物的健康生长提供保…

Windows系统如何查看端口被占用程序和停止占用端口程序

windows系统如何查看端口被占用程序和停止占用端口程序&#xff0c;以及windows常用的网络命令详解 打开命令窗口 电脑右下方&#xff0c;搜索框&#xff0c;输入“cmd”,回车打开dos命令窗口 查看系统所有被占用的端口命令 netstat -ano 查看指定端口是否被占用命令 netst…

CS144 计算机网络 Lab1:Stream Reassembler

前言 上一篇博客中我们完成了 Lab0&#xff0c;使用双端队列实现了一个字节流类 ByteStream&#xff0c;可以向字节流中写入数据并按写入顺序读出数据。由于网络环境的变化&#xff0c;发送端滑动窗口内的数据包到达接收端时可能失序&#xff0c;所以接收端收到数据之后不能直…

Windows Server --- RDP远程桌面服务器激活和RD授权

RDP远程桌面服务器激活和RD授权 一、激活服务器二、设置RD授权 系统&#xff1a;Window server 2008 R2 服务&#xff1a;远程桌面服务 注&#xff1a;该方法适合该远程桌面服务器没网络状态下&#xff08;离线&#xff09;&#xff0c;激活服务器。 一、激活服务器 1.打开远…

Spring学习笔记之Bean的循环依赖问题

文章目录 什么是Bean的循环依赖singleton下的set注入产生的循环依赖prototype下的set注入产生的循环依赖singleton下的构造注入产生的循环依赖Spring解决循环循环的机理&#xff08;面试题&#xff09; 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。…

leetcode 1614.括号的最大嵌套深度

⭐️ 题目描述 &#x1f31f;leetcode链接&#xff1a;括号的最大嵌套深度 ps&#xff1a; 使用数据结构栈来存储 ( 在使用 maxDepth 变量记录栈顶 top 的最大值&#xff0c;当遇到 ) 时删除栈顶元素。举个例子 (1)((2))(((3)))&#xff0c;当遇到第一个 ( 时 top 1&#xff…

对dubbo的DubboReference.check的参数进行剖析

背景 在使用dubbo的时候&#xff0c;发现当消费者启动的时候&#xff0c;如果提供者没有启动&#xff0c;即使提供者后来启动了&#xff0c;消费者也调不通提供者提供的接口了。 注册中心使用都是nacos dubbo版本是3.0.4 例子 接口 public interface DemoService {String…

中期国际:外汇交易的利器:善用挂单技巧优化交易策略

在外汇交易中&#xff0c;挂单技巧是提高交易效率和灵活性的重要利器之一。善用限价单和止损单可以帮助交易者有效规避风险、控制入场点和出场点&#xff0c;从而提高交易效果。本文将介绍一些MT4挂单技巧&#xff0c;以帮助交易者优化交易策略&#xff0c;提高交易效率。 1. 了…

猿辅导设立“青少年科学探索基金”,鼓励天才少年投入科学研究

“少年智则国智&#xff0c;少年富则国富&#xff0c;少年强则国强。”国家发展离不开人才的培养。伴随我国进入高质量发展轨道&#xff0c;科学、人才、教育三位一体融合发展已经刻不容缓。我国基础学科人才紧缺成了不争的事实。目前&#xff0c;中国的GDP目前已是世界第二位&…

nginx创建和监听套接字分析

https://cloud.tencent.com/developer/article/1859856 简介 nginx作为一个web服务器&#xff0c;肯定是有listen套接字对外提供服务的&#xff0c;listen套接字是用于接收HTTP请求。 nginx监听套接字的创建是根据配置文件的内容来创建的&#xff0c;在nginx.conf文件中有…

视频音乐如何转换成mp3?教你超简单的转换方法

MP3文件通常比视频文件更小。因此&#xff0c;通过将音乐从视频中提取并转换为MP3格式&#xff0c;您可以更轻松地存储和传输它们。如果计划在手机或其他设备上存储音乐&#xff0c;转换为MP3格式可以帮助我们节省存储空间。而且&#xff0c;如果需要将音乐发送给朋友或上传到互…

基于JAVA高校校园点餐系统-lw+ppt

文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计1. 系统结构图 三、功能截图总结 前言 21世纪的今天&#xff0c;随着社会的发展与进步&#xff0c;人们对信息科学的认识已从低层次提升到高层次&#xff0c;从感性认识逐渐转变为理性认识。管理工作的重要性也逐…

新生录取查询系统怎么制作?

在制作新生录取查询系统前&#xff0c;先跟老师们介绍一下招生录取的详细流程&#xff0c;以便老师们更好的完成录取工作的筹备&#xff0c;顺利过渡招生季&#xff01; 1. 招生宣传和报名&#xff1a;学校通过各种途径进行招生宣传&#xff0c;向学生和家长介绍学校的特色、教…

图数据库_Neo4j学习cypher语言_常用函数_关系函数_字符串函数_聚合函数_数据库备份_数据库恢复---Neo4j图数据库工作笔记0008

然后再来看一些常用函数,和字符串函数,这里举个例子,然后其他的 类似 可以看到substring字符串截取函数 可以看到截取成功 聚合函数 这里用了一个count(n) 统计函数,可以看到效果 关系函数,我们用过就是id(r) 可以取出对应的r的id来这样..

北京影视展BIRTV 2023亮点提前盘点

2023年8月23-26日&#xff0c;“融合创新 面向未来”——由国家广播电视总局和中央广播电视总台共同指导&#xff0c;中国广播电视国际经济技术合作总公司主办的第三十届北京国际广播电影电视展览会&#xff08;BIRTV2023&#xff09;将在北京中国国际展览中心&#xff08;朝阳…

大股东被纪检监察调查,会否成为大牧人上市之路的又一拦路虎?

据悉&#xff0c;深圳证券交易所上市审核委员会已经定于2023年8月17日召开2023年第63次上市审核委员会审议会议&#xff0c;审核青岛大牧人机械股份有限公司&#xff08;即“大牧人”&#xff09;首发上市。这已经是大牧人因股东股权纷争&#xff08;见相关媒体报道&#xff09…

项目经理掌控项目进度的重要手段——甘特图

项目经理最担心的是无法了解团队成员每天的工作内容以及项目的进展情况。因此&#xff0c;每天的会议和项目周报是项目经理掌控项目进度的重要手段&#xff0c;能够帮助项目经理及时了解和跟踪项目的进展。 进度控制是指监督项目状态、更新项目进展、管理进度基准变更&#x…

Python Tkinter 树状浏览图,类和函数及文件浏览的应用(由idlelib tree模块修改)

模块由idlelib tree模块修改&#xff0c;完善一些问题&#xff0c;重写了获取类和函数的方法&#xff0c;便于获取正在编辑代码的类和函数。重写了文件浏览模块&#xff0c;支持添加收藏&#xff0c;双击py&#xff08;pyw&#xff09;文件会打开函数浏览器&#xff0c;文件浏览…

【AGC】崩溃数据消失问题

【问题背景】 最近有开发者集成了AGC的崩溃服务&#xff0c;出现了一个问题&#xff0c;在集成完成后&#xff0c;触发崩溃事件测试&#xff0c;在AGC后台可以看到当天崩溃的数据&#xff0c;但是启动次数显示为0。等到第二天再看数据时&#xff0c;连昨天的崩溃数据都没有了。…

一文带你搞懂MySQL的隔离级别

一. 前言 最近遇到这样一个题目&#xff1a;【假设目前你们使用的数据库是MySQL&#xff0c;现在有一个事务A&#xff0c;在事务A开始时读取数据的结果是1&#xff1b;事务A中间有一段耗时操作&#xff0c;在事务A中做耗时操作的同时&#xff0c;有另外一个事务B把数据值改成了…