【Java 设计模式】结构型之适配器模式

发布时间:2024年01月19日

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。在本文中,我们将介绍 Java 中适配器模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

适配器模式是一种结构型设计模式,它允许一个接口转换成另一个接口。它允许原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式通常包含三个主要角色:目标接口(Target)、被适配者(Adaptee)、适配器(Adapter)。

在这里插入图片描述

  • 目标接口(Target): 客户端期望的接口,适配器将被适配者适配成这个接口
  • 被适配者(Adaptee): 需要被适配的类或接口,它与目标接口不兼容
  • 适配器(Adapter): 通过实现目标接口并包装被适配者,使得被适配者的接口能够被客户端调用

2. 应用场景

适配器模式通常在以下场景中使用:

  • 已有类的接口不符合客户端的需求:

    当一个已有类的接口与客户端的需求不匹配时,可以使用适配器模式将已有类的接口适配成客户端期望的接口

  • 需要复用多个现有子类的情况:

    如果需要复用一个或多个已有类的子类,但是这些子类的接口不符合需要,可以通过适配器模式适配这些子类

  • 不希望修改已有类的情况:

    如果不希望修改已有类的代码,但是需要使其与其他类或接口协同工作,可以使用适配器模式

3. 代码实现

下面通过一个简单的例子来演示适配器模式的实现。假设有一个多语言说话器(Speaker)接口,但是目前只支持说中文。现在需要在该多语言说话器中集成说外国话,如 英语。这时就可以使用适配器模式。

目标接口 Speaker

package com.cheney.demo;

public interface Speaker {
    void speak(String country, String something);
}

被适配者接口 AdvancedSpeaker

package com.cheney.demo;

public interface AdvancedSpeaker {
    void speakChinese(String something);

    void speakEnglish(String something);
}

具体的被适配者类 ChineseSpeaker

package com.cheney.demo;

public class ChineseSpeaker implements AdvancedSpeaker{

    @Override
    public void speakChinese(String something) {
        System.out.println("[中文] " + something);
    }

    @Override
    public void speakEnglish(String something) {

    }
}

具体的被适配者类 EnglishSpeaker

package com.cheney.demo;

public class EnglishSpeaker implements AdvancedSpeaker{

    @Override
    public void speakChinese(String something) {

    }

    @Override
    public void speakEnglish(String something) {
        System.out.println("[英文] " + something);
    }
}

适配器类 SpeakerAdapter

package com.cheney.demo;

public class SpeakerAdapter implements Speaker{

    private final AdvancedSpeaker advancedSpeaker;

    public SpeakerAdapter(String country) {
        if (country.equalsIgnoreCase("chinese")) {
            advancedSpeaker = new ChineseSpeaker();
        } else {
            advancedSpeaker = new EnglishSpeaker();
        }
    }

    @Override
    public void speak(String country, String something) {
        if (country.equalsIgnoreCase("chinese")) {
            advancedSpeaker.speakChinese(something);
        } else {
            advancedSpeaker.speakEnglish(something);
        }
    }
}

目标类 PeopleSpeaker

package com.cheney.demo;

public class PeopleSpeaker implements Speaker {
    @Override
    public void speak(String country, String something) {
        // 说中文
        if (country.equalsIgnoreCase("chinese")) {
            System.out.println(something);
        } else {
            // 使用适配器说外语
            SpeakerAdapter speakerAdapter = new SpeakerAdapter(something);
            speakerAdapter.speak(country, something);
        }
    }
}

客户端启动类

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        Speaker speaker = new PeopleSpeaker();

        speaker.speak("chinese", "你好!");
        speaker.speak("english", "Hello!");
    }
}

执行结果:

在这里插入图片描述

在上述例子中,Speaker 是目标接口,AdvancedSpeaker 是被适配者接口。ChineseSpeakerEnglishSpeaker 是具体的被适配者类。SpeakerAdapter 是适配器类,通过实现目标接口并包装不兼容的被适配者接口,使得客户端可以通过适配器调用被适配者的功能。PeopleSpeaker 是具体的目标类,负责说话,当说其他国家语言时,通过适配器调用说相应国家的话。

通过适配器模式,我们实现了谈话时对其他国家语言的兼容,而不需要修改原有的说话接口和被适配者类。这使得系统更加灵活,能够方便地扩展和添加新的语言的支持。

结语

适配器模式是一种在面对不同接口的系统集成中非常有用的设计模式。通过适配器,可以使原本不兼容的接口能够协同工作,提高了系统的灵活性和可维护性。在实际开发中,适配器模式常被用于集成第三方库、系统升级和接口兼容等场景。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135683903
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。