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

news/2024/10/21 3:34:10/

外观模式

  • 一.外观模式
    • 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.ppmy.cn/news/66119.html

相关文章

宏任务、微任务在时间循环中的执行

如何描述事件循环&#xff0c;及里面宏任务、微任务的执行过程 事件循环相关描述事件循环流程图案例案例代码案例解析 事件循环相关描述 为什么有事件循环 解决js单线程工作&#xff0c;会堵塞程序的问题 单线程任务类型 同步任务&#xff1a;在主线程上排队&#xff0c;直接执…

南京邮电大学数据库实验一(SQL语言)

文章目录 一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容1、了解并掌握SQL*Plus环境的使用2、用SQL的DDL语句图书管理系统创建基表3、为基表“读者”补充定义&#xff1a;职称只能取初级、中级、高级之一。4、用SQL的DML语句向上述基表中增加、修改和删除数据5、…

MySQL数据库——MySQL修改存储过程(ALTER PROCEDURE)

在实际开发过程中&#xff0c;业务需求修改的情况时有发生&#xff0c;所以修改 MySQL 中的存储过程是不可避免的。 MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。下面将详细讲解修改存储过程的方法。 MySQL 中修改存储过程的语法格式如下&#xff1a; ALTER PROCEDURE…

InnoDB线程模型

新版本结构演变 MySQL 5.7 版本 将 Undo日志表空间从共享表空间 ibdata 文件中分离出来&#xff0c;可以在安装 MySQL 时由用户自行指定文件大小和数量增加了 temporary 临时表空间&#xff0c;里面存储着临时表或临时查询结果集的数据Buffer Pool 大小可以动态修改&#xff0…

【最新可用】chatGPT镜像网站国内使用,免费稳定!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 2023.5.8新增一个 ChatGPT 国内免翻版 【网站名称】&#xff1a;Chat GPT Ai 【使用环境】&#xff1a;移动端/电脑网页端 ChatGPT是一款功能强大的免费在线聊天机器人&#xff0c;具有人工智能…

Java分布式事务(十八)

文章目录 🔥最终一致性分布式事务解决方案_什么是最大努力通知型分布式事务🔥最大努力通知型分布式事务_最大努力通知与可靠消息最终一致性的区别🔥最大努力通知型分布式事务解决方案🔥最大努力通知型分布式事务_案例业务说明🔥最大努力通知型分布式事务实战_实现充值…

docker学习笔记(二)

目录 启动Docker ​编辑 建立 Docker 用户 ​编辑 测试 Docker 是否正常工作 卸载Docker Docker镜像加速器配置 配置镜像 检查加速器是否生效 如何在Linux中的.json文件下保存并退出 如果我是使用vi操作进来的&#xff0c;我该如何保存并退出呢&#xff1f; 如何在Li…

RUST 每日一省:解引用Deref

“解引用”&#xff08;Deref&#xff09; 是“取引用”&#xff08;Ref&#xff09; 的反操作。 取引用&#xff0c; 我们有&、 &mut等操作符&#xff0c; 对应的&#xff0c; 解引用&#xff0c; 我们有*操作符。 默认的“取引用”、 “解引用”操作是互补抵消的关系…