适配器模式C++用法示例

news2024/10/6 6:02:49

五.适配器模式

  • 一.适配器模式
    • 1.原理
    • 2.适用场景
    • 3.代理、桥接、装饰器、适配器区别
    • 4.分类(类适配器模式、对象适配器模式)
  • 二.C++程序示例
    • 1.类适配器
    • 2.对象适配器

一.适配器模式

1.原理

适配器模式的原理是将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式有两种主要的实现方式:

2.适用场景

适配器模式可以帮助系统解决接口不兼容的问题,同时也可以提高代码的复用性和可维护性,使得系统更加灵活和可扩展。适配器模式主要应用于以下场景:

  1. 当需要使用一个已经存在的类,但是该类的接口与系统要求的接口不一致时,可以使用适配器模式将该类的接口转换成系统要求的接口。
  2. 当需要复用一些现有的类,但是这些类的接口与需要复用的类不一致时,可以使用适配器模式将这些类的接口转换成需要复用的类的接口。
  3. 当在设计新系统时,需要将一些已有的类集成进来,但是这些类的接口与系统的接口不兼容时,可以使用适配器模式将这些类的接口转换成系统的接口。
  4. 当需要为一个类提供多个不同的接口时,可以使用适配器模式将这些接口转换成该类的接口。
  5. 当需要实现一个复杂的功能,但是需要用到多个不同的类时,可以使用适配器模式将这些类的接口统一起来,以便于实现复杂的功能。

3.代理、桥接、装饰器、适配器区别

  1. 代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。
  2. 桥接模式:桥接模式的目的是将接口部分和实现部分分离,而让它们可以较为容易、独立地加以改变。
  3. 装饰器模式:装饰器模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
  4. 适配器模式:适配器模式是一种时候的补救策略,适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原来类相同的接口。

4.分类(类适配器模式、对象适配器模式)

  1. 类适配器模式:使用多重继承的方式,将被适配类的接口转换成目标接口。类适配器模式适用于以下场景:
1.需要使用一个已经存在的类,并且该类的接口与需要的接口不兼容。
2.不能修改被适配类的代码,因为该类已经被广泛使用,或者该类的源代码不可用。
3.适配器需要支持被适配类的所有接口。
  1. 对象适配器模式:使用组合的方式,将适配器类与被适配类组合在一起,实现接口适配。对象适配器模式适用于以下场景:
1.需要使用一个已经存在的类,并且该类的接口与需要的接口不兼容。
2.可以修改被适配类的代码,或者可以使用继承来扩展被适配类的功能。
3.适配器只需要支持被适配类的部分接口,或者需要支持多个被适配类的接口。

总的来说,如果可以修改被适配类的代码,并且不需要支持所有的被适配类接口,那么对象适配器模式是一个更加灵活和可扩展的选择。但是如果不能修改被适配类的代码,并且需要支持所有的被适配类接口,那么类适配器模式是一个更加合适的选择。

二.C++程序示例

1.类适配器

#include <iostream>

// 客户端需要使用的目标接口
class TargetInterface {
public:
    virtual void request() = 0;
};

// 需要被适配的类
class Adaptee {
public:
    void specificRequest() {
        std::cout << "Adaptee::specificRequest()" << std::endl;
    }
};

// 类适配器类,同时继承了目标接口和适配者类
class ClassAdapter : public TargetInterface, public Adaptee {
public:
    void request() override {
        specificRequest();  // 调用适配者类的方法
    }
};

int main() {
    TargetInterface* target = new ClassAdapter();  // 创建适配器对象
    target->request();  // 调用目标接口方法
    delete target;
    return 0;
}

上述代码中,客户端需要使用的是目标接口 TargetInterface,但是已有的类 Adaptee的接口与之不兼容。为了解决这个问题,创建了一个类适配器ClassAdapter,它同时继承了目标接口和适配者类,同时实现了目标接口中的方法,在该方法中调用了适配者类中的方法specificRequest()。

在这里插入图片描述

2.对象适配器

#include <iostream>

// 客户端需要使用的目标接口
class TargetInterface {
public:
    virtual void request() = 0;
};

// 需要被适配的类
class Adaptee {
public:
    void specificRequest() {
        std::cout << "Adaptee::specificRequest()" << std::endl;
    }
};

// 对象适配器类,同时持有一个适配者类的对象
class ObjectAdapter : public TargetInterface {
private:
    Adaptee* adaptee_;  // 持有一个适配者类的对象
public:
    ObjectAdapter(Adaptee* adaptee) : adaptee_(adaptee) {}
    void request() override {
        adaptee_->specificRequest();  // 调用适配者类的方法
    }
};

int main() {
    Adaptee* adaptee = new Adaptee();  // 创建适配者对象
    TargetInterface* target = new ObjectAdapter(adaptee);  // 创建适配器对象
    target->request();  // 调用目标接口方法
    delete target;
    delete adaptee;
    return 0;
}

上述代码中,Adaptee是需要被适配的类,它有一个specificRequest()方法。TargetInterface是客户端需要使用的目标接口,它有一个request()方法。ObjectAdapter是适配器类,它继承自TargetInterface,并持有一个Adaptee对象的指针。在ObjectAdapter的request()方法中,调用了Adaptee的specificRequest()方法,从而实现了将Adaptee的接口适配成TargetInterface的接口。

在这里插入图片描述

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

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

相关文章

权威认证!腾讯云数据安全中台入选工信部商用密码典型应用方案

近日&#xff0c;工业和信息化部、国家密码管理局发布了《关于公布工业和信息化领域商用密码典型应用方案名单的通知》&#xff0c;腾讯云“基于商用密码的数据安全中台”在众多方案中脱颖而出&#xff0c;成功入选工业和信息化领域商用密码典型应用方案名单。 密码可以实现信息…

在springboot项目中使用rocketmq消息队列实战

rocketmq环境搭建 在docket环境下安装部署rocketmq的方法记录在上一篇文章中。 (31条消息) docker环境下搭建rocketmq集群_haohulala的博客-CSDN博客 这种方式不一定是最好的&#xff0c;但是我用这种方式可以成功搭建rocketmq开发环境。 项目架构 我们需要在springboot中…

CSDN 周赛填空题,充满恶意的嘲讽

CSDN 周赛填空题&#xff0c;充满恶意的嘲讽41期的填空题44期的填空题45期的填空题再说题型老顾最近一直在玩 csdn 周赛&#xff0c;没啥想法&#xff0c;就是想票点小玩意&#xff0c;之前从第四十一期开始&#xff0c;题型进行了扩展&#xff0c;增加了填空、判断、单选。扩展…

C#调试与测试 | Assert(断言)

Assert(断言) 文章目录Assert(断言)前言什么是Assert适用场景使用示例检查传入的参数是否为空检查循环变量是否在规定范围内检查方法返回值是否为null结束语前言 今天我要和大家聊聊C#调试和测试中的一种神器——断言&#xff08;Assert&#xff09;。如果你还不知道什么是断言…

nvm-windows的安装使用及踩坑指南

nvm是node的一款版本管理工具&#xff0c;可以简单操作node版本的切换、安装、查看。常规来说&#xff0c;开发中安装一个node版本就够了&#xff0c;但是最近在开发中有的老项目或者一些特定的项目需要来回切换node的版本&#xff0c;不可能手动去卸载掉之前的node版本&#x…

轻松掌握微服务治理的注册中心Eureka到Nacos知识点

1、SpringCloud 1、介绍 2、消费者与服务者 3、服务拆分 1、介绍 2、服务之间调用 例如有两个微服务&#xff0c;分别提供用户信息和订单信息。两个服务都有自己的数据库&#xff0c;所以如下查订单信息是不能直接去查用户信息的数据库的&#xff0c;只能从订单服务发起远程…

Seata 将参展 SOFA 五周年开源集市~

SOFA 五周年开源集市4 月 15 日&#xff08;本周六&#xff09;&#xff0c;SOFAStack 社区将在北京市朝阳区恒通国际创新园 C work 举办开源五周年活动&#xff0c;现场将于 12:00 正式开放开源集市&#xff0c;欢迎感兴趣的开发者们前来参与。今天让我们一起走近认识下开源的…

上海雷卯推出DFN1006超小体积网口保护ESD ULC0342P26LV 带回扫

什么是静电放电&#xff1f; 静电放电是指由于两种不同材料之间的摩擦或分离而产生的电荷累积所引起的电荷释放现象。 为什么需要防静电保护&#xff1f; 静电放电会对电子设备造成损害&#xff0c;特别是对于灵敏的网络设备来说&#xff0c;静电放电可能导致设备损坏或失效。…

图卷积网络GCN---底层逻辑最简单直白的理解

一 、GNN是怎么被提出来的&#xff1f; 比较常见的有CNN、RNN等。CNN的核心在于它的kernel&#xff0c;kernel在图片上平移&#xff0c;通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性&#xff1a;一个小窗口无论移动到图片的哪一个位置&#xff0c;其内部的…

Elk运维-elastic7.6.1集群安装部署

wei集群安装结果说明 实例配置安装软件安装账号hadoop1 2C4G 磁盘&#xff1a;50G 云服务器 elasticsearch kibana rdhadoop2 2C4G 磁盘&#xff1a;50G 云服务器 elasticsearchrdhadoop3 2C4G 磁盘&#xff1a;50G 云服务器 elasticsearchrd整个安装过程使用的账号&…

linux(docker)下使用VuePress从零开始搭建自己的博客(一):VuePress环境搭建

目标&#xff1a;在linux centos下使用VuePress搭建博客系统&#xff0c;最好能利用docker进行备份和迁移。 本节内容&#xff1a;本节主要讲述VuePress的环境搭建过程&#xff0c;VuePress的基本配置以及备份和迁移。详细记录了从零开始搭建的过程&#xff0c;以及搭建过程中遇…

Apache配置与应用

1.基于域名的虚拟主机 为虚拟主机提供域名解析 基于域名&#xff1a;为每个虚拟主机使用不同的域名&#xff0c;但是其对应的 IP 地址是相同的。例如&#xff0c;www.benet.com 和 www.accp.com 站点的 IP 地址都是 192.168.80.10。这是使用最为普遍的虚拟 Web 主机类型。 方法…

【Java Web】015 -- Maven高级(分模块设计与开发、继承与聚合、私服)

目录 一、分模块设计与开发 1、为什么要分模块设计&#xff1f; 2、实践&#xff1a;分模块开发 ①、实现步骤 3、小结 二、继承与聚合 继承 1、继承关系 ①、为什么要在Maven工程中实现继承&#xff1f; ②、继承关系实现 ③、继承实现小结 ④、maven项目父子工程结构说明 2、…

Java Stream API 操作完全攻略:让你的代码更加出色 (二)

前言 Java Stream 是一种强大的数据处理工具&#xff0c;可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码&#xff0c;使其更具可读性和可维护性&#xff0c;从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面&#xff0c;包括 red…

WMS仓库管理系统,你能操作明白吗?别让"智能"变"滞能"

随着社会的进步&#xff0c;智能车间、智能工厂等申报的展开&#xff0c;“智能化”的概念&#xff0c;让企业系统出现更迭。以智能化仓储管理系统为例&#xff0c;企业工厂利用WMS的优势&#xff0c;依照运行的工作标准和运算法则&#xff0c;对仓库进行精细化管理。 WM…

IC学习笔记22——memory_compilermemory_wrapper

一、memory_compiler 1.1 memory_compiler的介绍 memory_compiler为一系列工具的统称,用于生成芯片开发所需要的memory。芯片开发中所需要的memory为sram、rom等。很多公司都有自己开发的memory_compiler工具。 1.2 SRAM基础 sram写操作(写1) 将要写入的数据“1”通过写入…

Vue学习笔记(3. 基本语法,数据绑定,指令)

1. 基本语法 vue2的基本语法如下&#xff1a; <html> <head> <title>testVUE</title> <script src"https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> </head><body><div id"app">模板…

【操作系统】深入理解Linux虚拟内存管理

【操作系统】深入理解Linux虚拟内存管理 本篇跟大家说说内存管理&#xff0c;内存管理还是比较重要的一个环节&#xff0c;理解了它&#xff0c;至少对整个操作系统的工作会有一个初步的轮廓。 虚拟内存 如果你是电子相关专业的&#xff0c;肯定在大学里捣鼓过单片机。 单片…

出口欧盟认证机构为什么推荐CE认证

产品做CE证书要什么好处&#xff0c;CE证书要什么作用&#xff1f; 在中国很多中小企业困扰的是&#xff0c;好不容易走出国门接到来自国外的订单。却因为没有相应的产品安全认证而无法顺利取得订单。或者当产品到达目的地后&#xff0c;因为无法提供相应的产品安全认证证明文件…

网络编程 端口状态都有哪些?

客户端各个状态&#xff1a; 三次握手阶段 CLOSED&#xff08;持续状态&#xff09; 关闭状态 SYN_SENT &#xff08;非常短暂&#xff09; SYN_SENT状态表示请求连接&#xff0c;当你要访问其它的计算机的服务时首先要发个同步信号给该端口&#xff0c;此时状态为SYN_SENT&a…