7.外观模式C++用法示例

news2024/10/5 7:30:53

外观模式

  • 一.外观模式
    • 1.原理
    • 2.特点
    • 3.外观模式与装饰器模式的异同
    • 4.应用场景
    • C++程序示例

一.外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了一个或多个复杂的子系统的复杂性,并使这些子系统更容易使用。

1.原理

外观模式的实现原理是将客户端与子系统解耦,使客户端不需要了解子系统内部结构和实现细节,只需与外观类交互即可完成相应操作。外观类将客户端的请求委托给子系统中的相应组件来处理,从而实现对子系统的封装。

2.特点

  1. 简化客户端与子系统之间的交互。客户端只需要通过外观类来访问子系统,而不需要了解子系统的内部结构和实现细节。
  2. 降低客户端与子系统之间的耦合度。外观类充当了客户端与子系统之间的中介,使得它们之间的依赖关系变得简单明了。
  3. 提高子系统的可维护性。由于客户端只能通过外观类来访问子系统,因此可以更容易地对子系统进行修改和维护,而不会对客户端造成影响。
  4. 隐藏子系统的复杂性。外观类封装了子系统的复杂性,使得客户端无需了解子系统的内部实现细节。
  5. 可以对子系统进行进一步封装。外观类可以进一步封装子系统,以提供更简单、更易用的接口给客户端使用。

3.外观模式与装饰器模式的异同

  • 相同点

1.都是结构型设计模式,关注的是对象之间的组合方式。
2.都可以在不改变原有对象结构的基础上,为对象添加新的行为。
3.都能够提高系统的灵活性和可扩展性,降低了系统的耦合度。

  • 不同点

1.目的不同:外观模式的目的是简化客户端与子系统之间的交互,隐藏子系统的复杂性;而装饰器模式的目的是在不改变原有对象结构的基础上,动态地为对象添加新的功能。
2.装饰对象的方式不同:外观模式中定义一个外观类,它封装了子系统的复杂性,并提供了一个简单的接口,以方便客户端访问子系统;在装饰器模式中使用了一个装饰器类,它包装了一个具体组件(即被装饰对象),并在运行时动态地为其添加新的行为。
3.关注点不同:外观模式关注的是对整个子系统的封装,以简化客户端的操作;而装饰器模式关注的是对单个对象的功能扩展,以增强其功能。
4.对原有类的影响不同:外观模式对原有子系统的代码没有任何影响,而装饰器模式则需要在原有类的基础上进行修改或添加新的代码。
5.调用方式不同:在外观模式中,客户端通过调用外观类的方法来访问子系统的功能;而在装饰器模式中,客户端通过调用装饰器对象的方法来访问被装饰对象的功能。

4.应用场景

  1. 封装复杂的子系统:外观模式常常用于封装复杂的子系统,例如操作系统的API接口、数据库的访问接口等。外观模式将这些复杂的子系统封装在一个外观类中,为客户端提供一个简单的接口,从而降低了客户端的开发难度。
  2. 简化接口:外观模式可以为客户端提供一个简单易用的接口,使得客户端能够更加方便地使用系统的功能。例如,一个多媒体播放器可能会使用外观模式来封装底层的音频、视频解码器,为客户端提供一个统一的播放接口。
  3. 实现系统解耦:外观模式可以将客户端与子系统之间的耦合度降到最低,从而提高系统的可维护性和可扩展性。例如,当需要更换底层的子系统时,只需要修改外观类即可,而不会影响客户端代码。
  4. 提高系统的性能:在一些性能要求较高的场景中,外观模式可以通过封装多个子系统的接口,实现一次性调用多个接口的功能,从而提高系统的性能。

C++程序示例

#include <iostream>
#include <string>
#include <vector>

// 子系统:账户
class AccountSystem {
public:
    void createAccount(const std::string& name, const std::string& password) {
        std::cout << "create account: " << name << std::endl;
    }

    void login(const std::string& name, const std::string& password) {
        std::cout << "login: " << name << std::endl;
    }

    void logout(const std::string& name) {
        std::cout << "logout: " << name << std::endl;
    }
};

// 子系统:存款
class DepositSystem {
public:
    void deposit(const std::string& name, double amount) {
        std::cout << "deposit " << amount << " to account " << name << std::endl;
    }

    void withdraw(const std::string& name, double amount) {
        std::cout << "withdraw " << amount << " from account " << name << std::endl;
    }
};

// 子系统:转账
class TransferSystem {
public:
    void transfer(const std::string& from, const std::string& to, double amount) {
        std::cout << "transfer " << amount << " from account " << from << " to account " << to << std::endl;
    }
};

// 外观类:银行系统
class BankSystem {
public:
    BankSystem() {
        accountSystem = new AccountSystem();
        depositSystem = new DepositSystem();
        transferSystem = new TransferSystem();
    }

    ~BankSystem() {
        delete accountSystem;
        delete depositSystem;
        delete transferSystem;
    }

    // 创建账户
    void createAccount(const std::string& name, const std::string& password) {
        accountSystem->createAccount(name, password);
    }

    // 登录
    void login(const std::string& name, const std::string& password) {
        accountSystem->login(name, password);
    }

    // 存款
    void deposit(const std::string& name, double amount) {
        depositSystem->deposit(name, amount);
    }

    // 取款
    void withdraw(const std::string& name, double amount) {
        depositSystem->withdraw(name, amount);
    }

    // 转账
    void transfer(const std::string& from, const std::string& to, double amount) {
        transferSystem->transfer(from, to, amount);
    }

private:
    AccountSystem* accountSystem;
    DepositSystem* depositSystem;
    TransferSystem* transferSystem;
};

// 客户端调用
int main() {
    BankSystem bank;
    bank.createAccount("Alice", "123456");
    bank.login("Alice", "123456");
    bank.deposit("Alice", 1000);
    bank.transfer("Alice", "Bob", 500);
    bank.withdraw("Alice", 200);
    return 0;
}

在这里插入图片描述

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

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

相关文章

图嵌入表示学习—Node Embeddings随机游走

Random Walk Approaches for Node Embeddings 一、随机游走基本概念 想象一个醉汉在图中随机的行走&#xff0c;其中走过的节点路径就是一个随机游走序列。 随机行走可以采取不同的策略&#xff0c;如行走的方向、每次行走的长度等。 二、图机器学习与NLP的关系 从图与NLP的…

posix线程的优先级测试

如果创建的线程不够多&#xff0c;有些问题是体现不出来的。 优先级打印&#xff1a; 测试目的&#xff1a;输出三种调度模式下的最大优先级和最小优先级 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #…

Kubernetes_容器网络_01_Docker网络原理(二)

文章目录 一、前言二、被隔离的Docker容器三、网桥Bridge四、VethPair网络对五、统一宿主机上的两个Container容器通信六、宿主机访问其上的容器七、宿主机上的容器访问另一个宿主机八、尾声 一、前言 二、被隔离的Docker容器 Linux 网络&#xff0c;就包括&#xff1a;网卡&…

技术选型对比- RPC(Feign VS Dubbo)

协议 Dubbo 支持多传输协议: Dubbo、Rmi、http,可灵活配置。默认的Dubbo协议&#xff1a;利用Netty&#xff0c;TCP传输&#xff0c;单一、异步、长连接&#xff0c;适合数据量小(传送数据小&#xff0c;不然影响带宽&#xff0c;响应速度)、高并发和服务提供者远远少于消费者…

UnityWebGL+阿里云服务器+Apache完成项目搭建展示

一、服务器相关 Step1:租借一台阿里云服务器 我自己租借了一台北京的ECS服务器&#xff0c;有免费一年的活动&#xff0c;1 vCPU 2 GiB&#xff0c;我自己选择的Ubuntu系统&#xff0c;也可以选择Windows系统 Step2:进入远程连接 进入自己的服务器实例后&#xff0c;点击远程…

vue+elementui+nodejs机票航空飞机航班查询与推荐

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode )本系统主要是为旅客提供更为便利的机票预定方式&#xff0c;同时提高民航的预定机票的工作效率。通过网络平台实现信息化和网络化&am…

关于Android的性能优化,主要是针对哪些方面的问题进行优化

前言 我们在开发Android的时候&#xff0c;经常会遇到一些性能问题&#xff1b;例如&#xff1a;卡顿、无响应&#xff0c;崩溃等&#xff0c;当然&#xff0c;这些问题为我们可以从日志来进行追踪&#xff0c;尽可能避免此类问题的发生&#xff0c;要解决这些问题&#xff0c…

mysql从零开始(05)----锁

全局锁 使用 # 启用全局锁 flush tables with read lock # 释放全局锁 unlock tables开启全局锁后&#xff0c;整个数据库就处于只读状态了&#xff0c;这种状态下&#xff0c;对数据的增删改操作、对表结构的更改操作都会被阻塞。 另外&#xff0c;当会话断开&#xff0c;全…

【1015. 可被 K 整除的最小整数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定正整数 k &#xff0c;你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。 返回 n 的长度。如果不存在这样的 n &#xff0c;就返回 -1。 注意&#xff1a; n 不符合 64 位带…

手把手教你在winform中将文本或文件路径拖到控件中

文章目录 前言博主履历介绍&#xff1a;一、将txt文件的所有内容复制到 RichTextBox中二、将txt文件的一行内容移动到RichTextBox中三、将多个文件的全路径复制到 RichTextBox中四 、源码1、[Winform从入门到精通&#xff08;1&#xff09;——&#xff08;如何年入30万&#x…

「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选

作为新经济综合服务平台第一品牌&#xff0c;36氪自2019年落地四川站以来&#xff0c;不断通过新锐、深度的商业报道&#xff0c;陪跑、支持四川的新经济产业。通过挖掘本土优质项目&#xff0c;36氪四川帮助企业链接更多资源&#xff0c;助力企业成长&#xff0c;促进行业发展…

分布式系统概念和设计——命名服务设计和落地经验

分布式系统概念和设计 通过命名服务&#xff0c;客户进程可以根据名字获取资源或对象的地址等属性。 被命名的实体可以是多种类型&#xff0c;并且可由不同的服务管理。 命名服务 命名是一个分布式系统中的非常基础的问题&#xff0c;名字在分布式系统中代表了广泛的资源&#…

C语言:指针求解鸡兔同笼问题

题目&#xff1a;鸡兔同笼问题 要求&#xff1a;使用自定义函数void calc(int h, int f,int *c,int *r) 求解鸡兔同笼问题。 h 表示总的头数&#xff0c;f 表示总的脚数。 例子&#xff1a; 输入&#xff1a; 5 16 输出&#xff1a; 2 3 分析&#xff1a; 在该代码中&a…

05-Docker安装Mysql、Redis、Tomcat

Docker 安装 Mysql 以安装 Mysql 5.7为例&#xff1a; docker pull mysql:5.7Mysql 单机 Mysql 5.7安装 启动 Mysql 容器&#xff0c;并配置容器卷映射&#xff1a; docker run -d -p 3306:3306 \--privilegedtrue \-v /app/mysql/log:/var/log/mysql \-v /app/mysql/data:…

ASP.NET Core MVC 从入门到精通之文件上传

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

VMware NSX-T Data Center 3.2.2.1 - 数据中心网络全栈虚拟化

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-nsx-t-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware NSX-T Data Center 3.2.2.1 | 30 MAR 2023 | Build 21487560 VMware NSX-T Data Center 3.2.2 | 08 …

NOA上车「清一色」自主品牌,哪些供应商正在突围前线

随着入门级L2进入普及周期&#xff0c;以NOA&#xff08;高速、城区&#xff09;为代表的L2/L2赛道&#xff0c;正在成为主机厂、硬件供应商、算法及软件方案商的下一波市场制高点的争夺阵地。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-3月中国市场&#xff08;不含…

MySQL基础(十六)变量、流程控制与游标

1. 变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为系统变量以及用户自定义变量。 1.1 系统变量 1.1.1 系统变量分类 变量由系统定义&#xff…

【Nacos在derby模式下密码忘记】使用derby的ij工具重置密码/修改密码

【问题描述】 nacos部署未用mysql,直接运行&#xff0c;使用了默认的derby数据库&#xff0c;这时候不一小心修改的密码给忘记了&#xff0c;无法登录 当时是部署在centos上的一个演示环境&#xff0c;没有采用mysql数据库&#xff0c;如果生产上&#xff0c;建议使用mysql。 …

php用户分享信息技术交流大学生论坛系统vue

系统应实现的目标 1. 提供安全、友好的操作环境&#xff1a;避免一些网上的不良言论&#xff0c;创造一个和谐的网络环境。 2. 提供发表帖子功能&#xff1a;注册的用户可以自由发帖&#xff0c;发表符合法律法规的言论。 3. 提供回复帖子功能&#xff1a;户可以自由回复&am…