大话设计模式之适配器模式

news/2024/4/17 8:33:06

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。

适配器模式涉及以下几个关键角色:

1. 目标接口(Target):客户端期望使用的接口。适配器通过实现这个接口来使得被适配的类能够与客户端协同工作。

2. 适配器(Adapter):它是适配器模式的核心组件,它实现了目标接口,并持有一个被适配的对象的引用。适配器通过调用被适配对象的方法来实现目标接口的方法。

3. 被适配者(Adaptee):它是客户端不直接使用但需要被适配器适配的类。

适配器模式可以分为两种实现方式:

- 类适配器模式:通过多重继承(在一些编程语言中支持多重继承的情况下)或者通过代理的方式实现适配器。在这种情况下,适配器类同时继承目标接口和被适配者类,并实现目标接口的方法,内部调用被适配者类的方法。

- 对象适配器模式:通过组合的方式实现适配器。在这种情况下,适配器持有一个被适配者类的引用,并实现目标接口的方法,内部调用被适配者类的方法。

适配器模式的优点包括:

- 提高了代码的复用性,可以将现有的类和接口组合在一起使用。
- 使得客户端无需修改现有代码,就可以使用新的接口。
- 可以解决不兼容接口之间的问题,使得原本不兼容的类可以协同工作。

但是,适配器模式也有一些缺点,例如:

- 如果适配器类过多,可能会导致系统中存在大量的适配器类,增加了系统的复杂性。
- 如果被适配者类的接口发生变化,可能需要修改适配器类的代码。

总的来说,适配器模式适用于需要在不改变现有代码的情况下与不兼容的接口进行交互的场景,它是一种非常有用的设计模式。

#include <iostream>// 被适配的类
class LegacyRectangle {
public:LegacyRectangle(int width, int height) : width_(width), height_(height) {}int calculateArea() const {return width_ * height_;}private:int width_;int height_;
};// 目标接口
class Rectangle {
public:virtual ~Rectangle() {}virtual int getArea() const = 0;
};// 适配器类,继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象
class RectangleAdapter : public Rectangle {
public:RectangleAdapter(const LegacyRectangle& legacyRectangle) : legacyRectangle_(legacyRectangle) {}int getArea() const override {// 在适配器中调用被适配者的方法return legacyRectangle_.calculateArea();}private:LegacyRectangle legacyRectangle_;
};int main() {// 使用适配器来调用 LegacyRectangle 的方法,但是通过 Rectangle 接口LegacyRectangle legacyRect(5, 10);RectangleAdapter adapter(legacyRect);// 通过 Rectangle 接口调用std::cout << "Area: " << adapter.getArea() << std::endl;return 0;
}/*
在这个示例中,LegacyRectangle 类是一个已经存在的类,它有一个 calculateArea() 方法用于计算矩形的面积。然后我们定义了一个新的接口 Rectangle,其中有一个 getArea() 方法用于获取矩形的面积。RectangleAdapter 类是适配器,它继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象,并在 getArea() 方法中调用 LegacyRectangle 的 calculateArea() 方法来实现 Rectangle 接口的方法。最后在 main() 函数中,我们通过适配器来使用 LegacyRectangle 的方法,但是通过 Rectangle 接口调用。
*/

觉得有帮助的话,打赏一下呗。。

           


https://www.xjx100.cn/news/3365575.html

相关文章

chromium源码学习-调试日志 LOG

在学习 chromium 源码时&#xff0c;我们经常需要增加调试日志&#xff0c;常见的用法一般是 // TurboNet.mm133134 LOG(INFO) << "TurboNet Engine started.";其中 INFO 代表当前这条日志的级别&#xff0c;使用的时候就是输入 INFO 就行。接下来我们在探索…

css预编译sass,css也可以变得优雅

1. 嵌套选择器 #content {article {h1 { color: #333 }p { margin-bottom: 1.4em }}aside { background-color: #EEE } }编译后 #content article h1 { color: #333 } #content article p { margin-bottom: 1.4em } #content aside { background-color: #EEE }2. 变量声明和使…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步&#xff1a; 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步&#xff1a; 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认&#xff08;Default&#x…

自定义注解@Log 插入操作日志

一&#xff0c;注解描述 // 作用位置&#xff0c;参数 方法 Target({ElementType.PARAMETER, ElementType.METHOD}) // 作用范围 运行时 Retention(RetentionPolicy.RUNTIME) Documented public interface Log {/*** 模块*/public String title() default "";/*** 模…

搜维尔科技:借助 ARVR 的力量缩小现代制造业的技能差距

借助ARVR的力量缩小现代制造业的技能差距 搜维尔科技&#xff1a;Senseglove案例-扩展机器人技术及其VR应用

mybatis批量新增数据

数据量大的时候如果在循环中执行单条新增操作&#xff0c;是非常慢的。那么如何在mybatis中实现批量新增数据呢&#xff1f; 方法 insert 标签的 foreach 属性可以用于批量插入数据。您可以使用 foreach 属性遍历一个集合&#xff0c;并为集合中的每个元素生成一条插入语句。…

朵米3.5客服系统源码2023正式版

源码简介 朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将客户请求分配给适当的客服人员&#xff0c;提高…

tomcat 知多少

Tomcat的缺省端口&#xff1a; 默认端口为8080&#xff0c;可以通过在tomcat安装包conf目录下&#xff0c;service.xml中的Connector元素的port属性来修改端口。 tomcat 常见 Connector 运行模式(优化)&#xff1a; 这三种模式的不同之处如下&#xff1a; BIO &#xff1a; 一…