设计模式-适配器模式

适配器模式

定义:将一个类的接口转为客户需要的另一个接口。目的是使原本不兼容而不能一起工作的那些类可以一起工作。

适配器模式从实现方式上分为两种,类适配器和对象适配器。这两种的区别在与实现方式的不同,一种采用继承,一种采用组合。

另外从使用目的也为分了两种,特殊适配器和缺省适配器。一种是为了复用原有的代码并适配当前的接口,一种是为了提供缺省的实现,避免子类实现不该实现的方法。

1、类适配器

如:我想给hashMap实现一个接口,但是我没法给他加啊。于是我可以新写一个类来继承HashMap,然后实现接口。

2、对象适配器

如果这个类已经有了继承关系,就需要将类用组合的方式适配

使用场景:想修改一个现有在运行的系统的接口来适应新的接口需求的时候。

注意事项:适配器模式不是在系统设计时使用的,而是为了解决正在运行的系统问题。

示例场景:目前系统里有一个VideoPlayer接口以及两个实现类Mp4Player和AviPlayer正在工作。而第三方要求我们提供一个MediaPlayer格式的接口,而我们又不能去改VideoPlayer接口的代码。那么怎么办呢?我们加了一个MediaAdapter来做中间的适配,然后写了一个实现类(MediaPlayerImpl)来实现MediaPlayer接口,这个类通过使用MediaAdapter来适配之前系统的接口。

代码示例:

public interface VideoPlayer {

    void playVideo();
}
public class Mp4Player implements VideoPlayer {

    @Override
    public void playVideo() {
        System.out.println("播放mp4视频");
    }
}
public class AviPlayer implements VideoPlayer {
    @Override
    public void playVideo() {
        System.out.println("播放avi视频");
    }
}
public interface MediaPlayer {

    void play(String mediaType);
}
public class MediaAdapter implements MediaPlayer {

    private VideoPlayer videoPlayer;


    public MediaAdapter(String videoType) {
        if(videoType.equalsIgnoreCase("mp4")){
            videoPlayer=new Mp4Player();
        }else if(videoType.equalsIgnoreCase("avi")){
            videoPlayer=new AviPlayer();
        }
    }

    @Override
    public void play(String mediaType) {
        videoPlayer.playVideo();
    }
}
public class MediaPlayerImpl implements MediaPlayer {

    private MediaAdapter mediaAdapter;

    @Override
    public void play(String mediaType) {
       mediaAdapter=new MediaAdapter(mediaType);
       mediaAdapter.play(mediaType);
    }
}

测试代码:

  public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
        MediaPlayer mediaPlayer=new MediaPlayerImpl();
        mediaPlayer.play("avi");
    }

返回目录

posted @ 2021-06-27 10:58  女友在高考  阅读(133)  评论(0编辑  收藏  举报