Java设计模式七:适配器模式

  适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

一、定义与特点

  适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

  将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

  • 适配器模式适用于以下场景
    1、以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
    2、使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
    3、有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

二、实现方式

(1)创建接口

  创建一个播放器的接口,定义play方法

public interface MediaPlayer {

    void play(String fileName);
}

(2)创建适配接口

  创建一个高级播放器的接口,用于增强播放器的功能

public interface AdvancedMediaPlayer {

    void playMp4(String fileName);

    void playAvi(String fileName);
}

(3)实现适配接口

  实现增强型播放器的扩展方法

public class Mp4Player implements AdvancedMediaPlayer {

    @Override
    public void playMp4(String fileName) {
        System.out.println("play mp4.");
    }

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

  实现增强型播放器的扩展方法

public class AviPlayer implements AdvancedMediaPlayer {

    @Override
    public void playMp4(String fileName) {

    }

    @Override
    public void playAvi(String fileName) {
        System.out.println("play avi.");
    }
}

(4)适配器的具体实现

  整合播放器的扩展功能,增强原始播放器功能

public class MediaAdapter implements MediaPlayer {

    private AdvancedMediaPlayer advancedMediaPlayer;

    @Override
    public void play(String fileName) {
        fileName = fileName.toLowerCase();
        if (fileName.endsWith(".mp4")) {
            advancedMediaPlayer = new Mp4Player();
            advancedMediaPlayer.playMp4(fileName);
        } else if (fileName.endsWith(".avi")) {
            advancedMediaPlayer = new AviPlayer();
            advancedMediaPlayer.playAvi(fileName);
        }
    }
}

(5)适配器的应用

  播放器及扩展功能的应用,增强了原始播放器的功能

public class Player implements MediaPlayer {

    private MediaAdapter mediaAdapter;

    @Override
    public void play(String fileName) {
        fileName = fileName.toLowerCase();
        if (fileName.endsWith(".mp3")) {
            System.out.println("play mp3.");
        } else if (fileName.endsWith(".mp4") || fileName.endsWith(".avi")) {
            mediaAdapter = new MediaAdapter();
            mediaAdapter.play(fileName);
        } else {
            System.out.println("file format not support.");
        }
    }
}

(6)测试实现

  测试播放器的实现效果,播放器原始功能得到增强

public class Test {

    public static void main(String[] args) {
        Player player = new Player();
        player.play("music.mp3");
        player.play("music.mp4");
        player.play("music.avi");
        
        player.play("music.wmv");
    }
}

  测试输出内容

play mp3.
play mp4.
play avi.
file format not support.

三、相关内容

  • 注意事项
    1、适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
    2、需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。

  • 优缺点
    1、可以让任何两个没有关联的类一起运行。
    2、提高了类的复用。
    3、增加了类的透明度。
    4、灵活性好。
    5、对类适配器来说,更换适配器的实现过程比较复杂。

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

  • 参考文章
    1、http://c.biancheng.net/view/1361.html
    2、https://www.runoob.com/design-pattern/adapter-pattern.html


更新时间:2020-08-19 14:58:25

本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-adapter.html
最后更新:2020-08-19 14:58:25

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×