结构型模式-适配器模式

发布时间 2023-11-10 14:01:41作者: Qt小罗

1 什么是适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式可以解决接口不兼容的问题,使得原本由于接口不匹配而无法协同工作的类可以一起工作。
适配器模式涉及三个主要角色:目标接口(Target Interface)、适配器(Adapter)和被适配者(Adaptee)。

  • 目标接口(Target Interface)定义了客户端所期望的使用的接口。
  • 适配器(Adapter)是一个实现了目标接口的类,它通过包装或继承被适配者来完成接口的转换。
  • 被适配者(Adaptee)是需要被适配的类或接口,它拥有不兼容目标接口的方法或功能。

2 举个例子

以下是一个简单的适配器模式示例:假设我们有一个旧的音乐播放器,它有一个播放音乐的方法 playMusic(),但是我们的新系统中希望使用一个统一的接口 MediaPlayer 来播放音乐。
首先,我们创建目标接口 MediaPlayer:

class MediaPlayer {
public:
    virtual void play() = 0;
};

接下来,我们定义一个适配器类 Adapter,它实现了目标接口 MediaPlayer,同时通过组合或继承方式将旧的音乐播放器(被适配者)包装起来:

#include <iostream>

class Adapter : public MediaPlayer {
private:
    OldMusicPlayer* oldPlayer;

public:
    Adapter(OldMusicPlayer* player) : oldPlayer(player) {}

    void play() override {
        oldPlayer->playMusic();
    }
};

然后,我们实现被适配者,即旧的音乐播放器 的 OldMusicPlayer 类:

class OldMusicPlayer {
public:
    void playMusic() {
        std::cout << "Playing music..." << std::endl;
    }
};

最后,我们可以使用适配器来播放音乐:

int main() {
    OldMusicPlayer* oldPlayer = new OldMusicPlayer();
    MediaPlayer* player = new Adapter(oldPlayer);

    player->play(); // 调用统一的接口,实际上会通过适配器调用旧的播放方法

    delete oldPlayer;
    delete player;

    return 0;
}

运行上述代码,将输出 “Playing music…”,说明适配器成功地将目标接口 MediaPlayer 的方法调用转换为了旧的音乐播放器的方法调用。
这个例子中,我们通过适配器模式,将旧的音乐播放器(OldMusicPlayer)适配到了新的系统中,使其可以通过统一的接口 MediaPlayer 进行使用。这样,我们可以在不修改旧代码的情况下,使其与新系统协同工作。

3 总结

适配器模式对于在现有系统中引入新接口或组件,或者与现有接口不兼容的第三方库进行集成非常有用。