读书笔记之适配器模式

来源:互联网 发布:云计算都招聘什么岗位 编辑:程序博客网 时间:2024/06/03 23:38

适配器模式
简介:是作为两个不兼容的接口之间的桥梁,这种设计模式属于结构型模式,他结合了两个独立接口的功能。就像读卡器作为适配器连接内存卡和笔记本。
意图:将一个类的接口转换为客户希望的另一个接口,适配器模式使得由于接口不兼容不能一起工作的类可以一起工作
解决:主要解决软件系统中,将“现存的对象”放到新的环境中,而新环境要求的接口是现阶段不能满足的。
适配器继承或依赖已有的对象,实现想要的目标接口,在我们有动机的修改一个正常运行的系统接口时,这时候考虑使用适配器模式,它不是在详细设计时添加的,而是解决正在服役的项目。

首先我们有一个高级媒体播放器类正在运行:
接口为:

package cn.com.adapter;//高级媒体播放器public interface MediaPlayer {   public void playVlc(String fileName);   public void playMp4(String fileName);}

为了区别不同的功能,实现类有两个为:

public class Mp4Player implements MediaPlayer {    @Override    public void playVlc(String fileName) {        // TODO Auto-generated method stub    }    @Override    public void playMp4(String fileName) {        System.out.println("play mp4 file,name:"+fileName);         }}
package cn.com.adapter;public class VlcPlayer implements MediaPlayer {    @Override    public void playVlc(String fileName) {        System.out.println("play vlc file,name:"+fileName);         }    @Override    public void playMp4(String fileName) {        // TODO Auto-generated method stub    }}

我们还有一个mp3播放器:
接口为:

package cn.com.adapter;//mp3播放器的接口public interface Mp3Player {   public void play(String audioType , String fileName);}

我们想将这两个高级播放功能添加到mp3播放器上,首先建立一个适配器mp3Adapter,将播放类型作为构造函数的参数,进一步来判断实例化哪一个高级播放器的功能类

package cn.com.adapter;public class Mp3Adapter implements Mp3Player {    MediaPlayer media;    public Mp3Adapter(String audioType){        if(audioType.equals("vlc")){            media = new VlcPlayer();         }else if(audioType.equals("mp4")){            media = new Mp4Player();        }    }    @Override    public void play(String audioType, String fileName) {        // TODO Auto-generated method stub        if(audioType.equals("vlc")){            media.playVlc(fileName);        }else if(audioType.equals("mp4")){            media.playMp4(fileName);        }    }}

最后用一个新型播放器实现mp3的接口,如果是mp3的播放功能就直接播放,如果是高级播放功能,就调用适配器来处理:

package cn.com.adapter;public class AudioPlayer implements Mp3Player {    Mp3Adapter mp3Adapter;    @Override    public void play(String audioType, String fileName) {        // TODO Auto-generated method stub        //播放MP3音乐文件的内置支持        if(audioType.equals("mp3")){            System.out.println("play mp3 file,name:"+fileName);        }else if(audioType.equals("vlc")||audioType.equals("mp4")){            mp3Adapter = new Mp3Adapter(audioType);            mp3Adapter.play(audioType, fileName);        }else{            System.out.println("不支持"+audioType+"的类型");        }    }}

最后来测试一下:

package cn.com.adapter;public class TetsAdapter {  public static void main(String[] args) {    AudioPlayer audioPlayer = new AudioPlayer();    audioPlayer.play("mp3", "年轻的战场.mp3");    audioPlayer.play("vlc", "love.vlc");    audioPlayer.play("mp4", "大话西游.mp4");    audioPlayer.play("avi", "NHDTA-788.avi");    audioPlayer.play("rmb", "RBX-154.rmb");}}

输出结果:
这里写图片描述

0 0
原创粉丝点击