适配器模式
- 将一种类型通过适配器类转换成另一种类型;
- 对象适配:通过适配器类实现目标接口(抽象类、普通类),重写目标中的相关方法,将被适配者类以对象形式传递给适配器类,并且该适配器类中重写相关方法,但是重写的方法具体代码执行的是被适配者类中的对应的或者相关的代码;
- 类适配:适配器类实现目标接口,并且继承被适配者类,重写在适配器类中重写目标接口中的方法,重写的方法的具体实现是调用继承的被适配者类中的对应的方法;
- 从枚举到迭代器
1、Vector类:遍历元素的方式是使用枚举,Enumeration;
2、Collection集合:遍历元素的方式使用Iterator
/*
我们有一个 BasicPlayer接口和一个实现了BasicPlayer接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
我们还有另一个接口 SuperPlayer 和实现了 SuperPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 BasicPlayer 接口的适配器类 BasicAdapter,
并使用 SuperPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 BasicAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。
AdaptorModeDemo,我们的演示类使用 AudioPlayer 类来播放各种格式。
*/
//对象适配法
public class AdaptorModeDemo {
public static void main(String[] args) {
AudioPlayer ap = new AudioPlayer();
ap.play("AVI","lhm");
ap.play("mp4","lz");
ap.play("mp3","qaz");
}
}
//基础播放器
interface BasicPlayer{
public void play(String audioType,String fileName);
}
//实现了BasicPlayer接口的实体类 AudioPlayer,创建实现了 MediaPlayer 接口的实体类
class AudioPlayer implements BasicPlayer{
private BasicAdapter ba;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("MP3")){
System.out.println("一般情况下,播放" + audioType + "格式的文件:" + fileName);
}else if (audioType.equalsIgnoreCase("AVI")||audioType.equalsIgnoreCase("mp4")){
ba = new BasicAdapter(audioType);
ba.play(audioType,fileName);
}else {
System.out.println("文件不支持");
}
}
}
//高级播放器
interface SuperPlayer{
public void playMp4(String fileName);
public void playAvi(String fileName);
}
//创建Avi播放器类
class AviPlayer implements SuperPlayer{
@Override
public void playMp4(String fileName) {
System.out.println();
}
@Override
public void playAvi(String fileName) {
System.out.println("播放AVI格式文件:" + fileName);
}
}
//创建Mp4播放器类
class Mp4Player implements SuperPlayer{
@Override
public void playMp4(String fileName) {
System.out.println("播放Mp4格式的文件:" + fileName);
}
@Override
public void playAvi(String fileName) {
}
}
//创建实现了 BasicPlayer 接口的适配器类。
class BasicAdapter implements BasicPlayer{
private SuperPlayer sp;
public BasicAdapter(String audioType){
if (audioType.equalsIgnoreCase("AVI")){
sp = new AviPlayer();
}else if (audioType.equalsIgnoreCase("MP4")){
sp = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("AVI")){
sp.playAvi(fileName);
}else if (audioType.equalsIgnoreCase("MP4")){
sp.playMp4(fileName);
}
}
}