路漫漫其修远兮,吾将上下而求索
适配器模式
电脑与手机存储卡是两个独立的个体,电脑不能直接读取手机存储卡的内容。但是通过读卡器,电脑就能读取手机存储卡的内容了,读卡器就相当于一个适配器,起到了电脑与手机存储卡之间的桥梁嫁接作用。
适配器即相当于读卡器,做为两个不兼容的接口之间的桥梁使用。
代码实现
场景:有一个展示GIF图片的接口,其实现类可以展示GIF图片;一个展示JPG与PNG图片的接口,其实现类可以展示JPG与PNG图片。现使用适配器模式,连接两个接口,使其能够展示GIF、JPG、PNG三种图片格式。
1、创建展示GIF图片的接口及其实现类
public interface Gif {
void gifPlay(String imgName);
}
public class GifPlayer implements Gif {
@Override
public void gifPlay(String gifName) {
System.out.println("Gif Gif Gif == " + gifName);
}
}
2、创建展示JPG、PNG图片的接口及其实现类
public interface JpgPng {
void jpgPlay(String jpgName);
void pngPlay(String pngName);
}
public class JpgPlayer implements JpgPng {
@Override
public void jpgPlay(String jpgName) {
System.out.println("JPG JPG JPG == " + jpgName);
}
@Override
public void pngPlay(String pngName) {
}
}
public class PngPlayer implements JpgPng {
@Override
public void jpgPlay(String jpgName) {
}
@Override
public void pngPlay(String pngName) {
System.out.println("PNG PNG PNG == " + pngName);
}
}
3、使用以上方法
public static void main(String[] args) {
Gif gif = new GifPlayer();
gif.gifPlay("A、GIF");
JpgPng jpgPlayer = new JpgPlayer();
jpgPlayer.jpgPlay("A、JPG");
JpgPng pngPlayer = new PngPlayer();
pngPlayer.pngPlay("A、PNG");
}
输出结果为:
Gif Gif Gif == A、GIF
JPG JPG JPG == A、JPG
PNG PNG PNG == A、PNG
4、使用适配器模式使其对外提供统一接口并支持展示GIF、PNG、JPG三种格式
编写适配器代码:
public class ImgAdapter implements Gif {
//该方法用来展示GIF图片
@Override
public void gifPlay(String imgName) {
System.out.println("GIF GIF GIF == " + imgName);
}
public void imgPlay(String imgType,String imgName) {
JpgPng jpgPng;
switch (imgType){
case "GIF":
gifPlay(imgName);
break;
case "JPG":
jpgPng = new JpgPlayer();
jpgPng.jpgPlay(imgName);
break;
case "PNG":
jpgPng = new PngPlayer();
jpgPng.pngPlay(imgName);
break;
default:
System.err.println("the imageType=" + imgType + " is not supported");
}
}
}
更改测试代码:
public static void main(String[] args) {
// Gif gif = new GifPlayer();
// gif.gifPlay("A、GIF");
//
// JpgPng jpgPlayer = new JpgPlayer();
// jpgPlayer.jpgPlay("A、JPG");
//
// JpgPng pngPlayer = new PngPlayer();
// pngPlayer.pngPlay("A、PNG");
ImgAdapter imgAdapter = new ImgAdapter();
imgAdapter.imgPlay("GIF","A、GIF");
imgAdapter.imgPlay("PNG","A、PNG");
imgAdapter.imgPlay("JPG","A、JPG");
imgAdapter.imgPlay("MP3","A、MP3");
}
输出结果为:
GIF GIF GIF == A、GIF
PNG PNG PNG == A、PNG
JPG JPG JPG == A、JPG
the imageType=MP3 is not supported
可以看到适配器实现了Gif接口,即解决方式需要继承或者依赖于原有接口,从而达到适配的作用。
思考
1、使用工厂模式是否更好
适配器模式适用于有动机的修改一个正常运行的的系统的接口,即其不是在设计之初就使用的,是在解决项目代码现有问题时使用的。
2、与参考文章区别
本文参考了菜鸟教程的讲解:https://www.runoob.com/design-pattern/adapter-pattern.html,在菜鸟教程中编写适配器以后再行编写的某一实现类的代码,感觉不符合解决现役问题的使用场景,所以与教程中规则不一样。