设计模式——适配器模式

适配器模式

    • [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. 适配器模式的应用场景

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作
  • 需要统一多个类的接口设计时
  • 旧系统开发的类与新系统不一致时,可以使用适配器模式使得旧系统的功能同样能在新系统中使用
相关推荐
shinelord明5 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J10 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅11 分钟前
C#关键字volatile
java·redis·c#
Monly2112 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2314 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd25 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha27 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_192849990637 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏39 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程