java设计模式-适配器设计模式

java设计模式-适配器设计模式

简单说一下(定义、举例)

什么是适配器设计模式:将一个接口转换成客户希望的另一个接口,使得原本由于接口不兼容

而不能一起工作的那些类能一起工作,其别名为包装器(Wrapper)。简言之就是两个不兼容

的接口之间的桥梁。

举个栗子:一个只会Chinese的中国人和一个只会English的英国人进行交谈,如果他们想正常

交谈,他们需要通过一个既会Chinese、又会English的人翻译来进行沟通交流。

稍微夸一下(优、缺点)

适配器设计模式的优点:

1.透明度:客户端通过适配器可以透明的调用目标接口

2.复用性:复用了现存的类,程序员不需要修改原有代码而重用现有的适配器者类

3.解耦性:将目标类与适配者类解耦,解决了目标类与适配者类接口不一致的问题

适配器设计模式的缺点:

1.对适配器来说,过多的使用适配器会让系统凌乱,而且更换适配器的实现过程比较复杂

2.由于java单继承的特性,所以至多适配一个适配者类,而且目标类必须是抽象类

顺便提一下(使用场景、何时使用)

1.使用场景

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

2.何时使用

**·**系统需要使用现有的类,但是现有的类的接口不符合系统的需求

**·**想建立一个重复使用的类,用于与彼此之间没有太大关联的一些类,这些原类不一定有一 致的接口

**·**通过接口转换,将一个类插入另一个类中

详细讲一下(模型结构)

模式结构主要分为以下角色:

1.目标接口:当前系统业务所期待的接口,他可以是抽象类或者接口

2.适配者类:将被访问和适配的现存组件库中的组件接口

3.适配器类:相当于转换器,通过继承或者引用适配的对象,把适配者接口转化成目标接口,让客户按照目标接口的格式访问适配者

可以根据下图理解:一图走天下(网上当的)

在这里插入图片描述

多多用一下(代码实现)

1.为媒体播放器和更高级的媒体播放器创建接口MediaPlayer.java,AdvanceMediaPlayer.java

public interface MediaPlayer {
    public void play(String audioType,String fileName);
}
-------------------------------------------------------------
public interface AdvanceMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}

创建实现了 AdvancedMediaPlayer 接口的实体类VlcPalyer.java , Mp4Player.java

public class VlcPlayer implements AdvanceMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file.Name"+fileName);
    }
    @Override
    public void playMp4(String fileName) {

    }
}
-------------------------------------------------------------
public class Mp4Player implements AdvanceMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        
    }
    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file.Name:"+fileName);
    }
}

3.创建实现了 MediaPlayer 接口的适配器类MediaAdapter.java

public class MediaAdapter implements MediaPlayer {

    AdvanceMediaPlayer advanceMediaPlayer;

    public MediaAdapter(String audioType){
        if(audioType.equalsIgnoreCase("vlc")){
            advanceMediaPlayer = new VlcPlayer();
        }else if(audioType.equalsIgnoreCase("mp4")){
            advanceMediaPlayer = new Mp4Player();
        }
    }
    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            advanceMediaPlayer.playVlc(fileName);
        }else if(audioType.equalsIgnoreCase("mp4")){
            advanceMediaPlayer.playMp4(fileName);
        }
    }
}

4.创建实现了 MediaPlayer 接口的实体类AudioPlayer.java

public class AudioPlayer implements MediaPlayer {
    
    MediaAdapter mediaAdapter;
    @Override
    public void play(String audioType, String fileName) {
        /*播放mp3音乐文件的内置支持*/
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file.Name:"+fileName);
        }
        /*mediaAdapter 提供了播放其他文件格式的支持*/
        else if(audioType.equalsIgnoreCase("vlc")||audioType.equalsIgnoreCase("mp4")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType,fileName);
        }
        else {
            System.out.println("Invalid media."+audioType+"format not support");
        }
    }
}

5.使用 AudioPlayer 来播放不同类型的音频格式AdapterPatternDemo.java

public class AdapterPatternDemo {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3","beyond the horizon.mp3");
        audioPlayer.play("mp4","alone.mp4");
        audioPlayer.play("vlc","far far away.vlc");
        audioPlayer.play("avi","mind me.avi");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值