c++设计模式之适配器模式

ops/2024/11/20 18:20:07/
  1. 适配器模式(Adapter Pattern)
    定义
    适配器模式的目的是让不兼容的接口能够协同工作。通过定义一个适配器类,将原本接口不兼容的两种类的接口转化为一致的接口,使得原本无法交互的类可以互操作。

应用场景
当你希望将一些已经存在的类、接口或服务纳入到现有的系统中,但它们的接口与系统不兼容时,可以使用适配器模式
例如,使用不同的外部库(如不同的交换机设备、数据库等),它们的接口可能不一致,这时可以通过适配器模式来统一接口。
结构
Target(目标接口):客户希望使用的接口。
Adapter(适配器):实现目标接口,通过适配已有的接口将不同的接口适配成统一的接口。
Adaptee(被适配者):需要适配的类或接口,通常是已经存在的类或库。
代码示例
假设我们有一个监控系统,需要与多种交换机设备(比如 S5730 和 S12700)进行通信,但它们的接口不一致。通过适配器模式,可以将它们统一为一个标准接口,使得监控系统能够统一管理这些设备。

1.1 定义目标接口

cpp
// SwitchInterface.h
#ifndef SWITCH_INTERFACE_H
#define SWITCH_INTERFACE_Hclass SwitchInterface {
public:virtual void login(const std::string& username, const std::string& password) = 0;virtual void configure(const std::string& config) = 0;virtual ~SwitchInterface() {}
};#endif // SWITCH_INTERFACE_H
SwitchInterface 定义了监控系统期望的统一接口,所有的交换机设备都需要实现这个接口。1.2 定义具体设备类
cpp
// S5730.h
#ifndef S5730_H
#define S5730_H#include <iostream>class S5730 {
public:void loginS5730(const std::string& username, const std::string& password) {std::cout << "S5730 login with username: " << username << std::endl;}void configureS5730(const std::string& config) {std::cout << "Configuring S5730 with: " << config << std::endl;}
};#endif // S5730_H
cpp
// S12700.h
#ifndef S12700_H
#define S12700_H#include <iostream>class S12700 {
public:void loginS12700(const std::string& username, const std::string& password) {std::cout << "S12700 login with username: " << username << std::endl;}void configureS12700(const std::string& config) {std::cout << "Configuring S12700 with: " << config << std::endl;}
};#endif // S12700_H1.3 定义适配器
cpp
// S5730Adapter.h
#ifndef S5730_ADAPTER_H
#define S5730_ADAPTER_H#include "SwitchInterface.h"
#include "S5730.h"class S5730Adapter : public SwitchInterface {
private:S5730 s5730;
public:void login(const std::string& username, const std::string& password) override {s5730.loginS5730(username, password);}void configure(const std::string& config) override {s5730.configureS5730(config);}
};#endif // S5730_ADAPTER_H
cpp// S12700Adapter.h
#ifndef S12700_ADAPTER_H
#define S12700_ADAPTER_H#include "SwitchInterface.h"
#include "S12700.h"class S12700Adapter : public SwitchInterface {
private:S12700 s12700;
public:void login(const std::string& username, const std::string& password) override {s12700.loginS12700(username, password);}void configure(const std::string& config) override {s12700.configureS12700(config);}
};#endif // S12700_ADAPTER_H
1.4 使用适配器
cpp
// Main.cpp
#include "S5730Adapter.h"
#include "S12700Adapter.h"int main() {SwitchInterface* switch1 = new S5730Adapter();switch1->login("admin", "password123");switch1->configure("Set interface GigabitEthernet0/0/1 to up");SwitchInterface* switch2 = new S12700Adapter();switch2->login("admin", "password456");switch2->configure("Set interface GigabitEthernet0/0/2 to down");delete switch1;delete switch2;return 0;
}

解释
SwitchInterface 定义了监控系统希望交互的接口。
S5730 和 S12700 是具体的交换机类,它们的接口与 SwitchInterface 不兼容。
S5730Adapter 和 S12700Adapter 是适配器,它们实现了 SwitchInterface 接口,并将调用委托给具体的设备类。
监控系统通过 SwitchInterface 接口与交换机交互,而不需要关心具体交换机的实现细节。
优点
通过适配器模式,监控软件能够与多个不同型号的交换机设备兼容。
添加新型号时,只需要为新型号实现一个适配器类,而无需修改现有的监控系统代码。

http://www.ppmy.cn/ops/135295.html

相关文章

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…

【Qt 蓝牙服务器实现】

在 Qt 中实现一个蓝牙服务器可以使用 Qt Bluetooth 模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。 首先,请确保你已经安装了 Qt Bluetooth 模块并在项目文件中包含了相关库。 1. 项目文件 (.pro) 配置 在项目文件中添加以下行,以确保包含 Qt Bluet…

IO流(九):打印流-字节打印流PrintStream、字符打印流PrintWriter

目录 1、什么是打印流&#xff1f; 2、字节打印流-PrintStream 2.1 代码演示以及注释 2.2 演示几种字节打印流常用的创建方式 3、字符打印流-PrintWriter 3.1 代码演示以及注释 3.2 演示几种字符打印流常用的创建方式 4、案例-System.out.println();输出内容重定向到指…

vue功能基础元素使用

4.:inline"true"元素&#xff0c;能够左右元素保持在同一行 这个好处非常直观&#xff0c;但要注意和el-col同时使用时&#xff0c;就会出现el-input换行&#xff0c;即便调整好&#xff0c;放大缩小也会出现换行问题。 5.filterable 下拉框带搜索功能 6.clearable下…

JSONP处理跨域请求

JSONP 背景 由于浏览器存在安全策略&#xff0c;所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域&#xff0c;这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验&#xff…

tcp的网络惊群问题

1. SO_REUSEPORT 可以解决epoll的惊群问题 但是&#xff0c;现在的 TCP Server&#xff0c;一般都是 多进程多路IO复用(epoll) 的并发模型&#xff0c;比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件&#xff0c;当有新连接建立时&#xff0c;所有进…

时序数据基础TDEngine

时序数据基础 什么是时序数据&#xff1f;​ 时序数据&#xff0c;即时间序列数据&#xff08;Time-Series Data&#xff09;&#xff0c;它们是一组按照时间发生先后顺序进行排列的序列数据。日常生活中&#xff0c;设备、传感器采集的数据就是时序数据&#xff0c;证券交易…

数据结构(单向链表——c语言实现)

链式存储的优缺点&#xff1a; 优点&#xff1a; 1、动态分配内存&#xff1a; 链式存储不需要在数据插入之前分配固定大小的数组或内存块&#xff0c;因此它更适合存储动态变化的数据 2、高效的插入和删除操作&#xff1a; 在链表中插入或删除元素只需要调整相邻节点的指…