适配器模式

来源:互联网 发布:淘宝商品详情api 编辑:程序博客网 时间:2024/05/16 15:40

目的

  • 将一个类的接口转换成客户希望的另一个接口。适配器模式是作为两个不兼容的接口之间的桥梁。

优点

  • 可以让任何两个没有关联的类一起运行
  • 提高了类的复用
  • 增加了类的透明度
  • 灵活性好

缺点

  • 过多的使用适配器,会让系统非常凌乱,不易整体把握。如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
  • 由于java只能继承一个类,所以至多只能适配一个适配者类,而且目标必须是抽象类
    注意事项
  • 适配器不是在详细设计时添加的,而是解决正在服役的项目的问题

第一步

  • 为媒体播放器和更高级的媒体播放器创建接口
    • MediaPlayer.java、AdvancedMediaPlayer.java
public interface MediaPlayer {    public void play(String audioType,String fileName);}
public interface AdvancedMediaPlayer {    public void playVlc(String fileName);    public void playMp4(String fileName);}

第二步

  • 创建实现了 AdvancedMediaPlayer 接口的实体类
    • VlcPlayer.java、Mp4Player.java
public class VlcPlayer implements AdvancedMediaPlayer {    @Override    public void playVlc(String fileName) {        System.out.println("Play vlc file. Name:" + fileName);    }    @Override    public void playMp4(String fileName) {    }}
public class Mp4Player implements AdvancedMediaPlayer {    @Override    public void playVlc(String fileName) {    }    @Override    public void playMp4(String fileName) {        System.out.println("Play mp4 file. Name:" + fileName);    }}

第三步

  • 创建实现了 MediaPlayer 接口的适配器类
    • MediaAdapter.java
public class MediaAdapter implements MediaPlayer {    private AdvancedMediaPlayer advancedMediaPlayer;    public MediaAdapter(String audioType) {        if (audioType.equalsIgnoreCase("vlc")) {            advancedMediaPlayer = new VlcPlayer();        }else if (audioType.equalsIgnoreCase("mp4")) {            advancedMediaPlayer = new Mp4Player();        }    }    @Override    public void play(String audioType, String fileName) {        if (audioType.equalsIgnoreCase("vlc")) {            advancedMediaPlayer.playVlc(fileName);        }else if (audioType.equalsIgnoreCase("mp4")) {            advancedMediaPlayer.playMp4(fileName);        }    }}

第四步

  • 创建实现了 MediaPlayer 接口的实体类
    • AudioPlayer.java
public class AudioPlayer implements MediaPlayer {    MediaAdapter mediaAdapter;    @Override    public void play(String audioType, String fileName) {        if (audioType.equalsIgnoreCase("mp3")) {            System.out.println("Play mp3 file. Name:"+fileName);        }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.");        }    }}

第五步

  • 使用 AudioPlayer 来播放不同类型的音频格式
    • AdapterDemo.java
public class AdapterDemo {    public static void main(String[] args) {        AudioPlayer audioPlayer = new AudioPlayer();        audioPlayer.play("mp3", "飞飞飞.mp3");        audioPlayer.play("mp4", "哇哈哈.mp4");        audioPlayer.play("vlc", "偶滴神.vlc");        audioPlayer.play("avi", "放假咯.avi");    }}

第六步

  • 收获结果
Play mp3 file. Name:飞飞飞.mp3Play mp4 file. Name:哇哈哈.mp4Play vlc file. Name:偶滴神.vlcInvalid media.avi format not supported.
原创粉丝点击