欢迎光临散文网 会员登陆 & 注册

Java设计模式-适配器模式

2023-08-19 21:59 作者:bili_52912388700  | 我要投稿

什么是适配器模式

适配器模式是一种结构型设计模式,它的主要作用是使得原本不兼容的接口可以一起工作。适配器模式通过创建一个包装类,将一个类的接口转换成客户期望的另一个接口。


主要解决什么问题

适配器模式主要解决的是在软件系统中,经常会遇到现有的类无法直接满足新的需求,需要使用一个已经存在的接口,但是这个接口又与现有的代码不兼容的问题。


在什么时候我们需要使用适配器模式

当我们需要使用一个已经存在的类,而它的接口不符合我们的需求,或者我们希望创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(即那些接口可能不一定兼容的类)协同工作时,我们可以使用适配器模式。


生活中的应用实例

生活中的一个常见例子就是电源适配器。比如,你的手机可能使用USB-C接口进行充电,但是你的电源插座可能只有标准的美式或欧式插孔。在这种情况下,你需要一个电源适配器,将电源插座的接口转换为USB-C接口,使得你的手机可以进行充电。


优点

可以让任何两个没有关联的类一起运行。

提高了类的复用性。

增加了类的透明度。

缺点

过多地使用适配器,会使系统非常零乱,不易整体进行把握。

由于Java至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景

系统需要使用现有的类,而这些类的接口不符合系统的需求。

想要建立一个可复用的类,用于与一些彼此之间没有太大关联的一些类,包括一些未来可能存在的类一起工作。

代码示例

假设我们有一个 MediaPlayer 接口,但是我们有一个 VlcPlayer 类只实现了 AdvancedMediaPlayer 接口。我们可以创建一个适配器 MediaAdapter 来使得 VlcPlayer 可以被 MediaPlayer 接口使用。


interface MediaPlayer {

    void play(String audioType, String fileName);

}


interface AdvancedMediaPlayer {

    void playVlc(String fileName);

}


class VlcPlayer implements AdvancedMediaPlayer {

    @Override

    public void playVlc(String fileName) {

        System.out.println("Playing vlc file. Name: " + fileName);

    }

}


class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMediaPlayer;


    public MediaAdapter(String audioType) {

        if (audioType.equalsIgnoreCase("vlc")) {

            advancedMediaPlayer = new VlcPlayer();

        }

    }


    @Override

    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("vlc")) {

            advancedMediaPlayer.playVlc(fileName);

        }

    }

}


class AudioPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;


    @Override

    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("vlc")) {

            mediaAdapter = new MediaAdapter(audioType);

            mediaAdapter.play(audioType, fileName);

        } else {

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

        }

    }

}

在这个例子中,AudioPlayer 使用 MediaAdapter 适配 VlcPlayer,使得 AudioPlayer 可以播放VLC格式的文件,而无需修改 VlcPlayer 类。


Java设计模式-适配器模式的评论 (共 条)

分享到微博请遵守国家法律