【设计模式四】适配器模式实现

路漫漫其修远兮,吾将上下而求索

适配器模式

电脑与手机存储卡是两个独立的个体,电脑不能直接读取手机存储卡的内容。但是通过读卡器,电脑就能读取手机存储卡的内容了,读卡器就相当于一个适配器,起到了电脑与手机存储卡之间的桥梁嫁接作用。

适配器即相当于读卡器,做为两个不兼容的接口之间的桥梁使用。

代码实现

场景:有一个展示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,在菜鸟教程中编写适配器以后再行编写的某一实现类的代码,感觉不符合解决现役问题的使用场景,所以与教程中规则不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值