• Java23种设计模式-结构型模式之适配器模式


    适配器模式(Adapter Pattern):核心思想是将现有的接口转换客户端所期望的接口。它允许通过将一个接口转换为另一个接口,将不兼容的类或对象组合在一起。12

    主要角色包括:
    目标(Target)接口:当前系统业务所期待的接口,可以是抽象类或接口。
    适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
    适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

    优点
    1.客户端可以通过适配器透明地调用目标接口。
    2.复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
    3.将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
    5.在很多业务场景中符合开闭原则
    缺点
    1.适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
    2.可能增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

    示例:创建一个MediaPlayer接口和一个实现了这个接口的AudioPlayer类,以及一个适配器类MediaAdapter,它将用于将不同格式的音频文件转换为MediaPlayer接口所需的格式

    //目标接口
    public interface MediaPlayer {
        void play(String audioType,String fileName);
    
    }
    //适配器
    public class MediaAdapter implements MediaPlayer{
    
        public MediaAdapter(String audioType) {
            System.out.println("MediaAdapter supports"+audioType+" adaption.");
        }
    
        @Override
        public void play(String audioType, String fileName) {
            System.out.println("Playing " + audioType + " file. Name: " + fileName);
        }
    }
    //适配者
    public class AudioPlayer implements MediaPlayer{
        @Override
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("mp3")){
                System.out.println("playing mp3 file. NameL:"+fileName);
            }else if (audioType.equalsIgnoreCase("mp4")){
                MediaPlayer mediaPlayer=new MediaAdapter(audioType);
                mediaPlayer.play(audioType,fileName);
            }else {
                System.out.println("Invalid media. " + audioType + " format not supported");
            }
        }
    }
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            MediaPlayer mediaPlayer=new AudioPlayer();
            mediaPlayer.play("mp3", "beyond the horizon.mp3");
            mediaPlayer.play("mp4", "alone.mp4");
            mediaPlayer.play("mp3", "water like wine.mp3");
        }
    }
    /**
     * playing mp3 file. NameL:beyond the horizon.mp3
     * MediaAdapter supportsmp4 adaption.
     * Playing mp4 file. Name: alone.mp4
     * playing mp3 file. NameL:water like wine.mp3
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    python datetime 返回一个时间段内的所有日期列表
    Hadoop3教程(二十五):Yarn的多队列调度器使用案例
    MySQL中的索引和事务
    PyCharm因安装了illuminated Cloud插件导致加载项目失败
    CSS3技巧37:JS+CSS3 制作旋转图片墙
    深度学习(PyTorch)——线性模型
    我辞职了!“没有Python编程经验的我,连简历都不敢投”
    router-link 和 router-view的区别
    C# Solidworks二次开发:程序工具界面和选项相关API详解
    java中的多线程
  • 原文地址:https://blog.csdn.net/csy08845/article/details/138150851