概述
我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
何时使用:
- 系统需要使用现有的类,而此类的接口不符合系统的需要.
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
- 通过接口转换,将一个类插入另一个类系中。通过接口转换,将一个类插入另一个类系中。
优点:
- 可以让任何两个没有关联的类一起运行。
- 提高了类的复用。
- 增加了类的透明度。
- 灵活性好。
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
- 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
实现:
为媒体播放器和更高级的媒体播放器创建接口。
package Media;
public interface MediaPlayer {
public void play(String audioType,String fileName);
}
package Media;
public interface AdvancedMediaPlayer {
public void playVlc(String fileName);
public void palyMp4(String fileName);
}
创建实现了 AdvancedMediaPlayer 接口的实体类。
package Media;
public class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file.name:"+fileName);
}
@Override
public void palyMp4(String fileName) {
//什么也不做
}
}
package Media;
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
//什么也不做
}
@Override
public void palyMp4(String fileName) {
System.out.println("Playing mp4 file.name:"+fileName);
}
}
创建实现了 MediaPlayer 接口的适配器类。
package Media;
public class MediaAdapter implements MediaPlayer {
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.palyMp4(fileName);
}
}
}
创建实现了 MediaPlayer 接口的实体类。
package Media;
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing 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 来播放不同类型的音频格式。
package Media;
import java.lang.reflect.Field;
public class AdapterDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3","黄家驹");
audioPlayer.play("mp4", "周杰伦");
audioPlayer.play("vlc","vlc");
audioPlayer.play("avi","not.avi");
}
}
输出结果
Playing mp3.file.Name黄家驹
Playing mp4 file.name:周杰伦
Playing vlc file.name:vlc
Invalid media.avi format not supported
最后
以上就是纯真嚓茶为你收集整理的JAVA设计模式(五)适配器模式的全部内容,希望文章能够帮你解决JAVA设计模式(五)适配器模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复