适配器模式

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

参考: 菜鸟教程-适配器模式

前提

为了解决类中方法更新而使用不了之前方法的问题

1. 类适配器模式

代码展示:


public interface Look {

    void GIFShow();

    void PNGShow();

}

public class PhotoAdapter extends PhotoShow implements Look{
    @Override
    public void GIFShow() {
        System.out.println("查看GIF图片");
    }
}

public class PhotoShow{

    public void JPGShow() {
        System.out.println("查看JPG图片格式");
    }


    public void PNGShow() {
        System.out.println("查看PNG图片格式");
    }
}

//在测试的时候可以发现不管是新方法还是之前的老办法都可以调用
public class ClassAdapterTest {

    public static void main(String[] args) {
        PhotoAdapter photoAdapter = new PhotoAdapter();
        photoAdapter.GIFShow();
        photoAdapter.JPGShow();
        photoAdapter.PNGShow();
    }

}

2. 对象适配器模式

public interface Look {

    void GIFShow();

    void PNGShow();

}

public class PhotoAdapter implements Look {

    private PhotoShow photoShow;

    public PhotoAdapter() {
    }

    public PhotoAdapter(PhotoShow photoShow) {
        this.photoShow = photoShow;
    }

    public void JPGShow(){
        photoShow.JPGShow();
    }

    @Override
    public void GIFShow() {
        System.out.println("查看GIF图片");
    }

    @Override
    public void PNGShow() {
        photoShow.PNGShow();
    }
}

public class PhotoAdapter implements Look {

    private PhotoShow photoShow;

    public PhotoAdapter() {
    }

    public PhotoAdapter(PhotoShow photoShow) {
        this.photoShow = photoShow;
    }

    public void JPGShow(){
        photoShow.JPGShow();
    }

    @Override
    public void GIFShow() {
        System.out.println("查看GIF图片");
    }

    @Override
    public void PNGShow() {
        photoShow.PNGShow();
    }
}

public class ClassAdapterTest {

    public static void main(String[] args) {
        PhotoAdapter photoAdapter = new PhotoAdapter(new PhotoShow());
        photoAdapter.GIFShow();
        photoAdapter.JPGShow();
        photoAdapter.PNGShow();
    }

}

3. 完整版本

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
在这里插入图片描述

代码实现:
AdvancedMediaPlayer.java

// 支持媒体文件的播放接口
public interface AdvancedMediaPlayer {

    void playVlc();

    void playMp4();

}

Mp4Player.java

// 对于mp4格式文件的实现
public class Mp4Player implements AdvancedMediaPlayer{
    @Override
    public void playVlc() {

    }

    @Override
    public void playMp4() {
        System.out.println("播放Mp4文件媒体");
    }
}

VlcPlayer .java

// 对于vlc格式文件的实现
public class VlcPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc() {
        System.out.println("播放vlc格式的媒体");
    }

    @Override
    public void playMp4() {

    }
}

MediaPlayer .java

// 支持音频格式的播放接口
public interface MediaPlayer {

    void play(String audioType);

}

MediaAdapter .java

// 采用了对象适配器的思想
public class MediaAdapter implements MediaPlayer{

    // 运用了对象适配器模式
    private AdvancedMediaPlayer advancedMediaPlayer;

    // 通过用户的要求动态调用指定接口的实现类中的功能
    public MediaAdapter(String audioType){
        if (audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer = new Mp4Player();
        } else if (audioType.equalsIgnoreCase("vlc")){
            advancedMediaPlayer = new VlcPlayer();
        } else {
            advancedMediaPlayer = null;
        }
    }

    @Override
    // 通过对象适配器模式拓展此接口的功能
    public void play(String audioType) {
        if (audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer.playMp4();
        } else if (audioType.equalsIgnoreCase("vlc")){
            advancedMediaPlayer.playVlc();
        } else {
            System.out.println("暂不支持此格式");
        }
    }
}

AudioPlayer .java

// 拓展之后的播放器
public class AudioPlayer implements MediaPlayer{

    private MediaAdapter mediaAdapter;

    @Override
    // 通过适配器属性将原有功能进行拓展
    public void play(String audioType) {
        if (audioType.equalsIgnoreCase("mp3")){
            System.out.println("播放mp3格式的音频");
        } else if (audioType.equalsIgnoreCase("mp4") || audioType.equalsIgnoreCase("vlc")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType);
        }
    }

}

DemoTest .java

// 测试
public class DemoTest {

    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3");
        audioPlayer.play("mp4");
        audioPlayer.play("vlc");
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值