定义
适配器设计模式是一种结构型设计模式,用于将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式包括三种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。
类适配器模式是通过继承来实现适配器功能。当我们要访问的接口A中没有我们想要的方法,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。
实现举例
假设我们有一个现有的类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
类实现了两个接口RealAudioStream
和AudioStream
,通过成员变量realStream
引用了RealAudioStream
对象,实现了适配功能。这样,我们就可以使用AudioStreamAdapter
类来适配RealAudioStream
类的接口,使其符合AudioStream
接口的要求。
总结
- 适配器模式是一种结构型设计模式,用于将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
- 适配器模式包括三种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。
- 类适配器模式是通过继承来实现适配器功能。
- 对象适配器模式是通过组合来实现适配器功能。
- 接口适配器模式是给出一个接口,可以动态选择实现这个接口的具体类,灵活性非常好。
原文地址:https://blog.csdn.net/scy518/article/details/134544817
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7397.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!