【设计模式】-- 适配器模式

示例一:给笔记本电脑充电

需求:只有两孔的插座,如何给需要三孔插座的笔记本充电?

public class TwoPlug {
    
    //使用两孔插座充电
    public void powerWithTwo(){
        System.out.println("使用两孔插座充电,充电中。。。");
    }

}
/*
 * 定义三孔插座接口
 */
public interface ThreePlugInterface {
    
    //使用三孔插座充电
    public void powerWithThree();

}
/*
 * 两孔转三孔插座的适配器
 */
public class TwoPlugAdapter implements ThreePlugInterface {
    
    private TwoPlug plug;

    public TwoPlugAdapter(TwoPlug plug) {
        this.plug = plug;
    }

    @Override
    public void powerWithThree() {
        System.out.println("两孔转三孔,转化成功。。。");
        plug.powerWithTwo();

    }

}
public class NoteBook {
    
    private ThreePlugInterface plug;
    
    public NoteBook(ThreePlugInterface plug){
        this.plug = plug;
    }
    
    //使用插座充电
    public void charge(){
        plug.powerWithThree();
    }

    public static void main(String[] args) {
        //笔记本要充电,但是我只有两孔的插座,如何给笔记本充电
        TwoPlug two =  new TwoPlug();
        ThreePlugInterface three =  new TwoPlugAdapter(two);//把二相的转三相
        NoteBook nb =  new NoteBook(three);
        nb.charge();
    }

}

输出结果

两孔转三孔,转化成功。。。
使用两孔插座充电,充电中。。。
/*
 * 采用继承式的插座适配器
 */
public class TwoPlugAdapterExtends extends TwoPlug implements ThreePlugInterface {

    @Override
    public void powerWithThree() {
        System.out.println("采用继承式的插座适配器。。。");
        this.powerWithTwo();

    }

}

通过继承式适配器来实现

    public static void main(String[] args) {
        //笔记本要充电,但是我只有两孔的插座,如何给笔记本充电
//      TwoPlug two =  new TwoPlug();
//      ThreePlugInterface three =  new TwoPlugAdapter(two);//把二相的转三相
//      NoteBook nb =  new NoteBook(three);
//      nb.charge();
        
        //继承式的插座适配器
        ThreePlugInterface three =  new TwoPlugAdapterExtends();
        NoteBook nb =  new NoteBook(three);
        nb.charge();
    }

输出结果

采用继承式的插座适配器。。。
使用两孔插座充电,充电中。。。

示例二:多媒体文件的播放

需求:播放器如何实现不同类型文件的播放?

/*
 * 定义一个统一的播放方法
 */
public interface MediaPlayer {
    
    public void play(String audioType, String fileName);

}
/*
 * 不同的类型走不同的方法
 */
public interface VideoMediaPlayer {

    public void playAVI(String fileName);

    public void playMP4(String fileName);

}
/*
 * AVI文件的实现
 */
public class AVIPlayer implements VideoMediaPlayer {


    @Override
    public void playAVI(String fileName) {
        
        System.out.println("开始播放AVI文件,名字为:" + fileName);
        
    }

    @Override
    public void playMP4(String fileName) {
        
    }

}
/*
 * MP4文件的实现
 */
public class Mp4Player implements VideoMediaPlayer {

    @Override
    public void playAVI(String fileName) {

    }

    @Override
    public void playMP4(String fileName) {
        System.out.println("开始播放MP4文件,名字为: " + fileName);
    }

}
/*
 * 根据不同的类型去实例化不同的对象
 */
public class MediaAdapter implements MediaPlayer {

    private VideoMediaPlayer videoMediaPlayer;

    public MediaAdapter(String audioType) {

        if (audioType.equalsIgnoreCase("avi")) {
            videoMediaPlayer = new AVIPlayer();

        } else if (audioType.equalsIgnoreCase("mp4")) {
            videoMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("avi")) {
            videoMediaPlayer.playAVI(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            videoMediaPlayer.playMP4(fileName);
        }

    }

}
/*
 * 根据不同的类型走不同的方法
 */
public class Adapter implements MediaPlayer {
    
    private MediaAdapter mediaAdapter; 

    @Override
    public void play(String audioType, String fileName) {

        if (audioType.equalsIgnoreCase("avi") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        else {
            System.out.println("无效的文件,不支持播放" + audioType + "类型");
        }
    }

}
/*
 * 测试方法
 */
public class AdapterPatternTest {

    public static void main(String[] args) {

        Adapter Player = new Adapter();
        Player.play("mp3", "Test MP3 File.mp3");
        Player.play("mp4", "Test MP4 File.mp4");
        Player.play("avi", "Test AVI File.avi");
        Player.play("flv", "Test FLV File.avi");
    }
    
}

测试结果

无效的文件,Test MP3 File.mp3不支持播放
开始播放MP4文件,名字为: Test MP4 File.mp4
开始播放AVI文件,名字为:Test AVI File.avi
无效的文件,Test FLV File.avi不支持播放
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 本文的结构如下: 什么是适配器模式 为什么要用该模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 ...
    w1992wishes阅读 884评论 0 3
  • 这篇文章讲的是适配器模式,适配器模式其实在我们日常生活中就有许许多多的例子例如插座转接头 车载充电器 介绍 适配器...
    东西的南北阅读 309评论 0 1
  • 适配器模式的官方定义是:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起...
    li_jun阅读 307评论 0 0
  • 前言 买过港版手机的都知道,包装盒里送的充电头是港标的。和我们大陆日常使用的国标是不兼容的。也就是说,港版手机直接...
    soberbad阅读 608评论 0 4
  • 类图 插座转换 德标接口 实现德标的德国插座 德国酒店 国标接口 实现国标的中国插座 适配器(插头转换 接口转换) 测试
    spike15阅读 202评论 0 0