设计模式(八)——适配器模式

适配器模式多用来拓展系统,是两个不兼容接口之间对接的桥梁,适配器结合了两个接口独立的功能。适配器模式不是用在系统设计阶段。

常见的适配器模式使用场景有如下这些:读卡器、笔记本充电器等。

示例如下:

项目最初设计了一个MediaPlayer接口,用来播放多媒体文件。

package AdapterPattern;
/**
 * 播放器
 */
public interface MediaPlayer {

   public void play();
    
}

最初只播放MP3格式的音频文件,于是又设计了一个MediaPlayer的实现类AudioPlayer用来播放MP3。

package AdapterPattern;
/**
 * 系统原有播放器,只能播放MP3格式的文件 
 */
public class AudioPlayer implements MediaPlayer{

    @Override
    public void play() {
        System.out.println("播放MP3.");
    }
    
}

此时来了一个新需求,要播放视频文件,格式也不止一种,有MP4的,也有VCR的。于是,设计一个新的高级播放器AdvancedMediaPlayer接口。

package AdapterPattern;
/**
 * 高级播放器
 */
public interface AdvancedMediaPlayer {

    public void playMP4();
    
    public void playVCR();
    
}

定义播放MP4和VCR的播放器。

package AdapterPattern;

public class MP4Player implements AdvancedMediaPlayer{

    @Override
    public void playMP4() {
        System.out.println("播放MP4.");
    }

    @Override
    public void playVCR() {
        //不予实现
    }

}


package AdapterPattern;

public class VCRPlayer implements AdvancedMediaPlayer{

    @Override
    public void playMP4() {
      //不予实现
    }

    @Override
    public void playVCR() {
        System.out.println("播放VCR.");
    }

}

现在有一个新需求,想让一个多媒体播放器既能播放MP3文件,也能播放MP4、VCR之类的视频文件。当然,可以通过项目重构来实现。那么不项目重构怎么实现呢?此时就需要适配器模式了。

首先修改多媒体播放器接口MediaPlayer,为播放方法新增播放文件类型参数。

package AdapterPattern;
/**
 * 播放器
 */
public interface MediaPlayer {
    
    public void play(String fileType);
    
}

因为是要给MediaPlayer集成播放视频的功能,所以高级播放器接口AdvancedMediaPlayer和MP4Player和VCRPlayer这两个实现类都不必修改。

新增适配器:

package AdapterPattern;
/**
 * 让MediaPlayer可以播放MP4和VCR
 */
public class MediaAdapter implements MediaPlayer{

    AdvancedMediaPlayer player;
    
    public MediaAdapter(String fileType) {
        if(fileType.equals("MP4")){
            player = new MP4Player();
        }else if(fileType.equals("VCR")){
            player = new VCRPlayer();
        }
    }
    
    @Override
    public void play(String fileType) {
        if(fileType.equals("MP4")){
            player.playMP4();
        }else if(fileType.equals("VCR")){
            player.playVCR();
        }
    }

}

因为要让MediaPlayer的实现类AudioPlayer播放视频,所以AudioPlayer也要做相应修改。

package AdapterPattern;
/**
 * 系统原有播放器,只能播放MP3格式的文件 
 */
public class AudioPlayer implements MediaPlayer{

    MediaAdapter adapter;
    
    @Override
    public void play(String fileType) {
        
        if(fileType.equals("MP3")){
            System.out.println("播放MP3.");
        }else if(fileType.equals("MP4") || fileType.equals("VCR")){
            adapter = new MediaAdapter(fileType);
            adapter.play(fileType);
        }
        
    }
    
}

运行测试类如下:

package AdapterPattern;

public class RunDemo {
    public static void main(String[] args) {
        MediaPlayer player = new AudioPlayer();
        player.play("MP3");
        player.play("MP4");
        player.play("VCR");
    }
}

运行结果图:

小结:适配器模式的核心在于,要给一个已有的接口集成新的功能,通过写适配器,继承或者实现原有的接口,重写原有接口的方法,增加新功能的实现。

适配器有很多种,对象适配器,类适配器,接口适配器。虽然名称不同,但是这三种适配器的不同之处只是在于实现的方式不一样,原理是一样的。

参考文档:设计模式|菜鸟教程,《设计模式之禅》

上一篇:设计模式(七)——原型模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值