适配器模式-C++实现

适配器是一种结构型设计模式,用于将一个接口转换为另一个客户端所需要的接口。该模式通过创建一个适配器对象,使不兼容的接口可以协同工作。

适配器模式主要分为三个角色:适配器类、目标类、适配者类。

适配器模式分为对象适配器类适配器

对象适配器是基于组合实现,而类适配器通过多继承方式实现。在类适配器模式中,适配器类即继承目标类,又继承适配者类,从而能够调用适配者类的方法,并将其适配到目标类身上。相比之下,对象适配器更加灵活,因为它是继承目标类、定义适配者对象,在目标类方法中调用适配者对象的方法,这种方法支持我们可以适配多个适配者类(也就是定义多个适配者类),所以更加灵活。

主要区别包括:

1、实现方式:对象适配器使用对象组合(composition)实现适配器功能,而类适配器使用多重继承(multiple inheritance)实现适配器功能。

2、关系:对象适配器通过持有适配者对象的引用来连接适配器与适配者,类适配器通过同时继承目标类和适配者类来连接适配器与适配者。

3、灵活性:对象适配器更加灵活,可以适配多个适配者类,并且可以动态切换适配者;类适配器在编译时就确定了适配者类,无法在运行时动态切换适配者。

因为类适配器是在编译时确定的,所以基本没有优点,我们这里举一个对象适配器的例子。

假设我们现在有一个模拟动物各种行为的机器人,它定义了叫喊和奔跑两种方法,我们现在希望不修改现有代码的基础上让机器人模仿狗的叫声和跑步姿势。

在这里插入图片描述

#include <iostream>
#include <memory>// 目标抽象类Robot
class IRobot
{
public:virtual ~IRobot() {}virtual void Cry() = 0;virtual void Run() = 0;
};// 适配者类 狗
class Dog
{
public:void Wang(){std::cout << "狗叫" << std::endl;}void Run(){std::cout << "狗跑" << std::endl;}
};// 适配器类
class DogAdapter: public IRobot
{
public:DogAdapter(std::shared_ptr<Dog> _dog): dog_(_dog){}virtual void Cry() override{std::cout << "机器人模仿: ";if (dog_)dog_->Wang();}virtual void Run() override{std::cout << "机器人模仿: ";if (dog_)dog_->Run();}private:std::shared_ptr<Dog> dog_;
};

测试:

void TestAdapter()
{std::shared_ptr<IRobot> robot = std::make_shared<DogAdapter>(std::make_shared<Dog>());robot->Cry();robot->Run();
}

输出:

机器人模仿: 狗叫
机器人模仿: 狗跑

为了实现这个示例,我们创建了一个抽象目标类 IRobot,定义了叫和跑两种方法。创建了一个具体适配者类 Dog,同样实现了叫和跑两种方法,创建了一个适配器类 DogAdapter继承IRobot,并且定义一个适配者对象,重写这两种方法,在这两种方法里调用适配者对象的叫和跑两种方法到达机器人模拟狗叫和狗跑的目的。

适配器模式遵循以下设计原则:

1、单一职责原则:适配器类的主要责任是将不兼容的接口转换为兼容的接口,它应该只关注适配工作,不涉及其他功能。

2、开闭原则:适配器模式允许系统在不修改现有代码的情况下引入新的适配器类,以适应不同的适配需要。

优点:

1、增加代码的可重用性:适配器模式可以重用现有的适配者类,无需修改其代码,增加系统的可维护性和灵活性。

2、系统的解耦:适配器模式将客户端和适配者类进行解耦,使得客户端不需要关心具体适配者类的实现细节。而且适配者类发生改变不影响客户端。

3、提高系统的扩展性:适配者模式允许在不修改现有代码的情况下增加新的适配器类以适应不同的接口需求。

缺点:

1、增加系统的复杂性:因为引入了适配器类,增加了系统的复杂性,对于简单系统可能显得过于繁琐。

2、增加运行时的开销:由于适配器需要进行接口转换和数据转换,可能会引入一些系统运行时的开销。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从功能测试到自动化测试,我总结了一些工作经验分享给大家

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【MySQL】事务(事务四大特性+四种隔离级别+MVCC)

事务 前言正式开始事务的四大特性为什么会出现事务事务的版本支持事务提交方式事务常见操作方式启动事务回滚演示提交事务事务的异常autocommit 事务的隔离性隔离级别查看隔离级别修改隔离级别验证四种隔离级别读未提交(read uncommitted) —— 缩写为RU读提交(read committed)…

一些后端测试的东西

后端测试都测试些什么 接口测试最小单元测试联调测试 接口测试 接口测试要素 可重复性 异常覆盖 环境一致 如何进行方便的接口测试 测试工具&#xff1a; idea-httpRequest &#xff0c; apifox , postman, jmeter 如何使用idea进行高效的接口测试 编写接口 启动项目直接…

Rest模式和参数

展开运算符和Rest参数都是JavaScript中的语法特性&#xff0c;用于处理函数的参数。它们在使用方式和功能上有一些区别。 展开运算符用于将可迭代对象展开为独立的值&#xff0c;而Rest参数用于将多个参数收集到一个数组中。展开运算符可以用于多种上下文&#xff0c;而Rest参数…

iOS NSDate的常用API

目录 一、创建日期 1.获取当前时间 2.当前时间指定秒数之后/前的时间 3.指定日期之后/后的时间 4.2001年之后/前指定秒数的时间 5.1970年之后/后指定秒数的时间 二、初始化日期 1.init 2.时间间指定秒数的时间 3.指定时间指定秒数之前/后的时间 4.2001年指定秒数之后…

超级利器!Postman自动化接口测试让你提升测试效率,节省宝贵时间!

Postman自动化接口测试 该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境&#xff1a; Window 7 - 64 Postman 版本&#xff08;免费版&#xff09;&#xff1a;Chrome App v5.5.3 …

如何在Docker环境下安装Firefox浏览器并结合内网穿透工具实现公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

c#把bitmap格式转换为其他格式图片

增加引用命名空间 using System.Drawing.Imaging; 打开对话框的方式读入bmp格式图片&#xff0c;转换为其他格式。 也可以直接传入图片名称。 OpenFileDialog ofd new OpenFileDialog();ofd.Title "打开对话框";ofd.InitialDirectory "D:/";ofd.Filt…

NoSQL 数据建模错误会降低性能

数据建模错误是破坏性能的最简单方法之一。当您使用 NoSQL 时&#xff0c;特别容易搞砸&#xff0c;&#xff08;讽刺的是&#xff09;NoSQL 往往用于对性能最敏感的工作负载。NoSQL 数据建模最初可能看起来非常简单&#xff1a;只需对数据进行建模以适应应用程序的访问模式。但…

初识向量数据库

背景 现在的数据分为20%的传统结构化数据&#xff0c;80%的非结构化数据 结构化数据&#xff1a;主要单元是数值与符号&#xff0c;数据类型高度抽象且易于组织。基于数值运算与关系代数&#xff0c;可以轻松地对结构化数据进行分析。 非结构化数据&#xff1a;常见的类型包括…

禁区!V社CSGO皮肤交易不可触及之红线

2013年8月13日&#xff0c;Valve通过一次版本更新向全世界发布了CS:GO的皮肤系统。自那时起&#xff0c;皮肤系统就成为CS:GO的重要组成部分&#xff0c;不仅为游戏增添了别样的特色&#xff0c;也创造了属于自己的“金融”市场。随着越来越多玩家的加入&#xff0c;皮肤市场也…

高浓度医疗废水处理工艺设备有哪些

高浓度医疗废水处理是目前环境保护领域的一个重要课题。随着医疗行业的快速发展&#xff0c;产生的医疗废水中含有大量的有害物质和病原体&#xff0c;对水资源和环境造成了严重污染威胁。因此&#xff0c;采用适当的处理工艺设备对高浓度医疗废水进行有效的处理和净化显得尤为…