设计模式 基础篇02 适配器模式

应用场景

  • 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  • JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
  • 在 LINUX 上运行 WINDOWS 程序。

优点

  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
  • 在很多业务场景中符合开闭原则

缺点

  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱


主要组件

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目
    标接口,让客户按目标接口的格式访问适配者。

结构示意图

类适配器模式,少用在这里插入图片描述


对象适配器模式,常用
在这里插入图片描述

简要概括

  • 对象适配器模式
    例如,存在适配器A1、A2,都实现了适配器接口Target,那么可以通过Target接口来引用A1或A2,

样例场景


样例代码

/**
 * @program: DesignPatterns
 * @description:
 * @author: TATE.LU
 * @create: 2020-12-08 09:26
 **/
public class Adapter {
    public static void main(String[] args){
        MediaPlayerAdapter mediaPlayerAdapter=new MediaPlayerAdapter("mp4");
        mediaPlayerAdapter.play("mp4","复仇者联盟3.mp4");
        mediaPlayerAdapter=new MediaPlayerAdapter("vlc");
        mediaPlayerAdapter.play("vlc","miss you.vlc");

    }


}



//媒体播放器接口
interface MediaPlayer{
    public void play(String audioType,String fileName);
}

interface AdvancedMediaPlayer{
    public void playVlc(String fileName);
    public void  playMp4(String fileName);

}


class VlcPlayer implements AdvancedMediaPlayer{

    public void playVlc(String fileName) {
        System.out.println("play vlc file. filename="+fileName);
    }

    public void playMp4(String fileName) {
//       什么也不做
    }
}

class Mp4Player implements AdvancedMediaPlayer{

    public void playVlc(String fileName) {
//       什么也不做
    }

    public void playMp4(String fileName) {
        System.out.println("play mp4 file. filename="+fileName);
    }
}

class MediaPlayerAdapter implements  MediaPlayer{
    private AdvancedMediaPlayer advancedMediaPlayer;

//利用构造函数,传入媒体类型再生成具体对象
    public MediaPlayerAdapter(String mediaType){
        if(mediaType.equals("vlc")){
            advancedMediaPlayer=new VlcPlayer();
        }else if(mediaType.equals("mp4")){
            advancedMediaPlayer=new Mp4Player();
        }
    }

    public void play(String audioType, String fileName) {
        if(audioType.equals("vlc")){
            advancedMediaPlayer.playVlc(fileName);
        }else if(audioType.equals("mp4")){
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}



参考链接

C语言中文网
菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值