适配器模式

分类专栏:
设计模式

文章标签:
设计模式
结构型模式
原创

适配器模式

作为两个不兼容的接口之间的桥梁,结合了两个独立接口的功能,涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能

创建意图与使用步骤

意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的
何时使用
1)系统需要使用现有的类,而此类的接口不符合系统的需要
2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口
3)通过接口转换,将一个类插入另一个类系中
如何解决:继承或依赖
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口

优缺点

优点:
1)可以让任何两个没有关联的类一起运行
2)提高了类的复用
3)增加了类的透明度
4)灵活性好
缺点:
1)过多地使用适配器,会让系统非常零乱,不易整体进行把握,因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
2)由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

实现

1)已知Mp3Player接口和一个实现了Mp3layer 接口的实体类AudioPlayer,AudioPlayer可以播放 mp3格式的音频文件
VMPlayer接口和实现了VMPlayer接口的实体类。该类可以播放vlc和mp4格式的文件
2)需求:想要让AudioPlayer播放其他格式的音频文件
3)需要:创建一个实现了Mp3Player接口的适配器类Mp3Adapter,并使用VMPlayer对象来播放所需的格式
AudioPlayer使用适配器类Mp3Adapter传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterDemo类使用AudioPlayer类来播放各种格式

1.创建Mp3Player接口

public interface Mp3Player{
        public void play(String audioType,String fileName);
    }

2.创建VMPlayer接口

public interface VMPlayer{
        public void playVlc(String fileName);
        public void playMp4(String fileName);
    }

3.创建实现VMPlayer接口的实现类

public class VlcPlayer implements VMPlayer{

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

        @Override
        public void playMp4(String fileName) {

        }
    }

    public class Mp4Player implements VMPlayer{

        @Override
        public void playVlc(String fileName) {
            
        }

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

4.创建Mp3Player接口的适配器类

public class Mp3Adapter implements Mp3Player{
        
        VMPlayer vmPlayer;
        
        public Mp3Adapter(String audioType){
            if (audioType.equalsIgnoreCase("vlc")){
                vmPlayer = new VlcPlayer();
            }else if (audioType.equalsIgnoreCase("mp4")){
                vmPlayer = new Mp4Player();
            }
        }

        @Override
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("vlc")){
                vmPlayer.playVlc(fileName);
            }else if (audioType.equalsIgnoreCase("mp4")){
                vmPlayer.playMp4(fileName);
            }
        }
    }

5.创建实现Mp3Player接口的实体类

public class AudioPlayer implements Mp3Player{
        Mp3Adapter mp3Adapter;

        @Override
        public void play(String audioType, String fileName) {
            //播放MP3文件的支持
            if (audioType.equalsIgnoreCase("mp3")){
                System.out.println("Playing mp3 file.Name:"+fileName);
            }
            //Mp3Adapter提供了其他文件格式支持
            else if (audioType.equalsIgnoreCase("vlc")
                    || audioType.equalsIgnoreCase("mp4")){
                mp3Adapter = new Mp3Adapter(audioType);
                mp3Adapter.play(audioType,fileName);
				//其他格式不支持
            }else {
                System.out.println("Invalid media."+audioType+"format not supported");
            }
        }
    }

6.使用AudioPlyer播放不同格式音频

public class AdapterDemo {
   public static void main(String[] args) {
      AudioPlayer audioPlayer = new AudioPlayer();

      audioPlayer.play("mp3", "beyond the horizon.mp3");
      audioPlayer.play("mp4", "alone.mp4");
      audioPlayer.play("vlc", "far far away.vlc");
      audioPlayer.play("avi", "mind me.avi");
   }
}
注意事项:适配器不是在详细设计时添加的,而是解决现有项目问题
  • 作者:潘震
  • 评论

    pz
    博主
    Test
    留言