适配器模式的应用实例

一、适配器模式的概述

适配器模式是一种将一个类的接口转换成客户期望的另一个接口的设计模式,旨在解决原接口与目标接口之间不兼容的问题。

适配器模式分为类适配器模式和对象适配器模式,类适配器模式使用继承关系来实现,而对象适配器模式使用组合关系来实现。

二、适配器模式的应用实例类图

下面是适配器模式的应用实例的类图:

┌──────────┐                  ┌───────────────┐
│  Target  │◄─────────────── │  Adapter      │
└──────────┘                  ├─ adaptee      │
                               ├─ request()    │
                               └───────────────┘

┌───────────────┐
│  Adaptee      │
└───────────────┘

三、适配器模式的应用实例有哪些

适配器模式在实际项目中有很多应用,以下是几个常见的应用实例:

四、适配器模式的例子

以美国插头和中国插座为例,插头不兼容是一个典型的适配器模式应用实例。美国的插头是二平行插脚的,而中国的插座是二楔形插孔的,它们不兼容。所以需要一个适配器来做桥梁,将美国插头转换为中国插座可以接收的形式。

下面是适配器模式的应用实例的代码:

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

// 目标接口
public interface Target {
    void request();
}

// 适配器
public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 源类
public class Adaptee {
    public void specificRequest() {
        System.out.println("美国插头");
    }
}

五、工厂方法模式的应用实例

一个系统中可能存在多个播放器,每个播放器支持播放不同的音频格式,为了满足客户端需要,需要把所有的播放器统一到一个接口中去。这时可以采用适配器模式来解决问题。

下面是适配器模式的应用实例的代码:

// 客户端代码
public class Client {
    public static void main(String[] args) {
        MediaPlayer player;

        player = new AudioPlayer();
        player.play("mp3", "Beyond the horizon.mp3");

        player = new MediaAdapter("mp4");
        player.play("mp4", "alone.mp4");

        player = new MediaAdapter("vlc");
        player.play("vlc", "far far away.vlc");
    }
}

// 目标接口
public interface MediaPlayer {
    public void play(String audioType, String fileName);
}

// 源类
public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);

    public void playMp4(String fileName);
}

// 播放器类
public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        // 播放 mp3 音乐文件的内置支持
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        }

        // mediaAdapter 提供了播放其他文件格式的支持
        else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }

        else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

// 适配器类
public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

// 源类
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {}

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

// 源类
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {}
}

六、适配器模式应用场景

适配器模式可以用在以下场景中:

  • 系统需要使用一些现有的类,而这些类的接口不符合系统的需求。
  • 想要创建一个可以重用的类,他的接口与其它不相关或不可预见的类的接口协作。
  • 需要将一些类的接口转换为客户端期望的接口。

七、对象适配器模式的典型应用

使用对象适配器模式将一个类的接口转换成客户希望的另一个接口,这种情况下我们可以使用对象适配器模式。

下面是对象适配器模式的应用实例的代码:

// 目标接口
public interface Target {
    void request();
}

// 源类
public class Adaptee {
    public void specificRequest() {
        System.out.println("美国插头");
    }
}

// 适配器
public class ObjectAdapter implements Target {
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Target target = new ObjectAdapter(new Adaptee());
        target.request();
    }
}

八、适配器模式经典例子

适配器模式的经典例子是JAVA集合框架中的 Enumeration接口,该接口提供了一种读取一组数据的方式,但是它的方法与 Iterator的方法不同,由于 Iterator更加灵活和易用,于是可以使用适配器模式来将 Enumeration适配成 Iterator接口。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/296022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-27 12:57
下一篇 2024-12-27 12:57

相关推荐

  • SSVMW介绍及应用实例解析

    SSVMW是轻量级高性能的Web框架,能够快速地提高Web应用程序的安全性、性能和可靠性。下面我们将从多个方面对SSVMW进行详细的阐述,介绍如何使用它来构建Web应用程序。 一、…

    编程 2025-04-29
  • Python动态输入: 从基础使用到应用实例

    Python是一种高级编程语言,因其简单易学和可读性而备受欢迎。Python允许程序员通过标准输入或命令行获得用户输入,这使得Python语言无法预测或控制输入。在本文中,我们将详…

    编程 2025-04-28
  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Python 自建AI模型应用实例

    本文将介绍如何使用Python自建AI模型,以及如何应用到实际场景中。包括构建深度神经网络、训练模型、预测数据、可视化结果等方面。 一、深度神经网络构建 深度神经网络是AI模型的核…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什么 PSM模式,即页面-状态-模型模式,是一种前端开发模式。它以页面为中心,将页面内的所有状态和业务逻辑抽象成一个由页面转化而来的虚拟状态机模型,从而将业务逻辑与…

    编程 2025-04-25
  • 授权码模式与OAuth2.0

    一、什么是授权码模式 授权码模式(Authorization Code Grant Type)是OAuth2.0协议中最常用的授权方式之一,也是最为安全的一种授权方式。授权码模式的…

    编程 2025-04-24
  • 暗黑模式的盛行

    一、背景和定义 暗黑模式起源于智能手表和夜视仪等专业设备上的配色方案,是指采用黑底白字、暗灰底白字等相对较暗的背景色搭配亮色前景,以减少屏幕对用户眼睛的刺激,降低视觉疲劳感。这种设…

    编程 2025-04-24

发表回复

登录后才能评论