适配器模式
作为两个不兼容接口的桥梁,具备了两个接口的功能。举例类似于自来水跟饮用水之间的过滤器。
优点
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点
- 表面上看上去是使用接口A,其实是使用了接口B。
- 挂羊头卖狗肉,代码规模庞大时不方便记忆,容易混淆,增加复杂度。
- 如果可以不适用适配器,就尽量不使用。
案例举例
让播放器可以使用高级播放器的功能变成多功能播放器。
代码实现
package Adapter;
public class AdapterDemo {
public static void main(String[] args) {
MultifunctionPlayer MultifunctionPlayer = new MultifunctionPlayer();
MultifunctionPlayer.play("music","稻花");
MultifunctionPlayer.play("movie","长津湖");
MultifunctionPlayer.play("img","123456.jpg");
MultifunctionPlayer.play("mp4","123.mp4");
}
//播放器
public interface AdvancedMediaPlayer{
//播放音乐
public void playMovie(String fileName);
//播放电影
public void playMusic(String fileName);
}
public static class MoviePlayer implements AdvancedMediaPlayer{
@Override
public void playMovie(String fileName) {
System.out.println("播放视频:"+fileName);
}
@Override
public void playMusic(String fileName) {
}
}
public static class MusicPlayer implements AdvancedMediaPlayer{
@Override
public void playMovie(String fileName) {
}
@Override
public void playMusic(String fileName) {
System.out.println("播放音乐:"+fileName);
}
}
//媒体播放器
public interface MediaPlayer{
public void play(String type,String fileName);
}
public static class MediaAdapter implements MediaPlayer{
AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String type){
if (type.equals("movie")){
advancedMediaPlayer = new MoviePlayer();
}else if (type.equals("music")){
advancedMediaPlayer = new MusicPlayer();
}
}
@Override
public void play(String type,String fileName) {
if (type.equals("music")){
advancedMediaPlayer.playMusic(fileName);
}else if (type.equals("movie")){
advancedMediaPlayer.playMovie(fileName);
}
}
}
public static class MultifunctionPlayer implements MediaPlayer{
MediaPlayer MediaPlayer;
@Override
public void play(String type, String fileName) {
if (type.equals("img")){
System.out.println("查看图像:"+fileName);
}else if (type.equals("music") ||
type.equals("movie")){
MediaPlayer = new MediaAdapter(type);
MediaPlayer.play(type,fileName);
}else {
System.out.println("不支持:"+type);
}
}
}
}
展示: