设计模式——适配器模式

适配器模式

    • [1. 什么是适配器模式?](#1. 什么是适配器模式?)
    • [2. 为什么需要适配器模式?](#2. 为什么需要适配器模式?)
    • [3. 适配器模式的结构](#3. 适配器模式的结构)
    • [4. 适配器模式的实现](#4. 适配器模式的实现)
    • [5. 适配器模式的优缺点](#5. 适配器模式的优缺点)
    • [6. 适配器模式的应用场景](#6. 适配器模式的应用场景)

1. 什么是适配器模式?

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器让原本由于接口不兼容而不能一起工作的类可以一起工作。

简单来说,适配器就像是一个转接头,它连接两个不兼容的接口,使它们能够协同工作。

2. 为什么需要适配器模式?

在实际开发中,我们经常会遇到以下情况:

  • 想使用一个已经存在的类,但其接口与我们的要求不符合
  • 想创建一个可复用的类,但该类与一些不兼容的类一起工作
  • 想使用一些已经存在的子类,但不可能对每一个子类都进行子类化以匹配新的接口

这时,适配器模式就能派上用场了。

3. 适配器模式的结构

适配器模式主要包含以下角色:

  • 目标接口(Target):客户端所期望的接口
  • 适配者(Adaptee):需要适配的类或接口
  • 适配器(Adapter):连接目标接口和适配者的桥梁

4. 适配器模式的实现

假设有一个播放MP3音乐的应用,现在想要增加播放VLC格式音乐的功能。

首先,我们有一个现有的MP3播放器接口:

java 复制代码
public interface MediaPlayer {
    void play(String audioType, String fileName);
}

然后,有一个VLC播放器,但它的接口与MediaPlayer不兼容:

java 复制代码
public class VlcPlayer {
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }
}

现在,创建一个适配器来使VlcPlayer与MediaPlayer接口兼容:

java 复制代码
public class MediaAdapter implements MediaPlayer {
    VlcPlayer vlcPlayer;

    public MediaAdapter() {
        vlcPlayer = new VlcPlayer();
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            vlcPlayer.playVlc(fileName);
        }
    }
}

最后,可以在主程序中使用适配器:

java 复制代码
public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: " + fileName);
        } 
        else if(audioType.equalsIgnoreCase("vlc")){
            mediaAdapter = new MediaAdapter();
            mediaAdapter.play(audioType, fileName);
        }
    }
}

5. 适配器模式的优缺点

优点:

  • 提高了类的复用性
  • 增加了类的透明度
  • 灵活性和扩展性都非常好

缺点:

  • 过多地使用适配器会让系统变得凌乱
  • 由于JAVA至多继承一个类,所以至多只能适配一个适配者类

6. 适配器模式的应用场景

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作
  • 需要统一多个类的接口设计时
  • 旧系统开发的类与新系统不一致时,可以使用适配器模式使得旧系统的功能同样能在新系统中使用
相关推荐
艾迪的技术之路21 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98040 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师42 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
Gavynlee1 小时前
plantuml用法总结
设计模式
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan2 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea