设计模式-Adapter

news/2024/9/23 5:24:08/

定义

适配器设计模式是一种结构型设计模式,用于将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式包括三种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。

类适配器模式是通过继承来实现适配器功能。当我们要访问的接口A中没有我们想要的方法,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。

对象适配器模式是通过组合来实现适配器功能。

如需进一步了解适配器设计模式,建议阅读相关书籍。

实现举例

当然可以,以下是一个使用C++实现的适配器设计模式的例子:

假设我们有一个现有的类RealAudioStream,它实现了音频流数据的读取和写入,但是它的接口不符合我们需要的接口AudioStream。因此,我们需要创建一个适配器类AudioStreamAdapter,它将RealAudioStream的接口适配成AudioStream的接口。

// 现有的类RealAudioStream
class RealAudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 需要适配的接口AudioStream
class AudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 适配器类AudioStreamAdapter,继承自RealAudioStream和AudioStream
class AudioStreamAdapter : public RealAudioStream, public AudioStream {
public:void open(const char* filename) override {realStream.open(filename);}void close() override {realStream.close();}void read(char* buffer, int size) override {realStream.read(buffer, size);}void write(const char* buffer, int size) override {realStream.write(buffer, size);}
private:RealAudioStream& realStream; // 引用RealAudioStream对象,实现适配功能
};

在上面的例子中,AudioStreamAdapter类实现了两个接口RealAudioStreamAudioStream,通过成员变量realStream引用了RealAudioStream对象,实现了适配功能。这样,我们就可以使用AudioStreamAdapter类来适配RealAudioStream类的接口,使其符合AudioStream接口的要求。

总结

适配器设计模式的特性:

  1. 适配器模式是一种结构型设计模式,用于将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
  2. 适配器模式包括三种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。
  3. 类适配器模式是通过继承来实现适配器功能。
  4. 对象适配器模式是通过组合来实现适配器功能。
  5. 接口适配器模式是给出一个接口,可以动态选择实现这个接口的具体类,灵活性非常好。

http://www.ppmy.cn/news/1235411.html

相关文章

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…

露营管理系统预约小程序效果如何

旅游经济已经复苏,并且市场规模增速加快,近一年来远途/周边游客户增多,不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目,其需求也是日渐上升。 然而在高需求的同时,我们也看到露营经营痛…

没有PDF密码,如何解密?

PDF文件有两种密码,一个打开密码、一个限制编辑密码,因为PDF文件设置了密码,那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密? PDF和office一样,可以对文件进行加密,但是没有提供恢复密码的功…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot延时插件实现)

rabbitMQ安装插件rabbitmq-delayed-message-exchange 交换机由此type 表示组件安装成功 生产者发送消息时设置延迟值 消息在交换机滞纳至指定延迟后,进入队列,被消费者消费。 组件注解类: package com.esint.configs;import org.springfra…

Vue生成二维码并进行二维码图片下载

1、安包 npm install vue-qr --save2、引入 // vue2.0 import VueQr from vue-qr // vue3.0 import VueQr from vue-qr/src/packages/vue-qr.vue new Vue({components: {VueQr} })<!-- 设备二维码 对话框 270px--><el-dialog title"点位二维码" :visible.…

【vue+eltable】修改表格滚动条样式

<style lang"scss" scoped> ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 10px; /*纵向滚动条的宽度*/height: 10px; /*横向滚动条的高度*/ } /*定义滚动条轨道 内阴影圆角*/ ::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {bo…

Dropout 作用

一、 前言 Dropout出现的原因 训练深度神经网络的时候&#xff0c;总是会遇到两大问题&#xff1a;&#xff08;1&#xff09;容易过拟合&#xff08;2&#xff09;网络费时 在机器学习的模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出…

小猪优版的前世今生:从籍籍无名到行业瞩目,再到骤变的风暴中心

1. 前世&#xff1a;籍籍无名到行业新星的崛起 小猪优版在初创时期&#xff0c;并不被大众所知。然而&#xff0c;它凭借对短视频行业的深度洞察&#xff0c;以及独特的商业模式&#xff0c;开始在这个领域崭露头角。它提供了一个平台&#xff0c;不仅助力内容创作者更好地展现…