适配器模式--结构型模式

前言

学习设计模式,我强烈推荐借鉴5W1H的方法,因为干巴巴的看很难理解其中的精髓,很容易陷入一种“看山是山”的境地,无法深刻体会其中的奥妙和玄机。
桥接模式属于结构型模式,重要程度三颗星(心):💕💕💕

一、为什么用(WHY)

现在有一些类或者接口不能在一起工作

二、解决什么问题(WHAT)

需要将原来不能一起工作的类或者接口使其能够一起工作,去解决问题。

1、系统想要使用一个类,但是这个类不满足当前的需求。
2、想要建立一个可以复用的类,将一些没啥关系的类结合起来使用,这些源类不一定有一致的接口
3、通过接口转换,将一个类转换到另外一个类中(这个地方是从别的地方搜集的,我感觉用组合的方式更优雅,欢迎各位大佬雅正)

三、在什么地方用(WHERE)

碰见第二部分的问题的地方或者问题的类的地方用

四、什么时候用(WHEN)

碰见第二部分的问题的时候用

五、谁用(WHO)

需要解决问题的人,当然是可爱的程序员我们了。

六、怎么用(HOW)

6.1 类图

但从这个类图来看很难梳理出来个一二三。
在这里插入图片描述

6.2 具体实现

要具体的工程代码,请点击,github地址,代码持续更新,后边会完善23种设计模式的具体实现,有兴趣的朋友,可以关注【程序猿每日分享】公众号,一起happy,一起浪。

  1. 无关类1和2

/**
 * 无关类1或者叫源类1
 * 目标:实现MediaPlayer和AdvancedMediaPlayer的关联
 */
public interface MediaPlayer {
    /**
     * 根据类型播放文件
     * @param audioType
     * @param fileName
     */
    public void play(String audioType,String fileName);
}


/**
 * 无关联类2或者源类2
 * 目标:实现MediaPlayer和AdvancedMediaPlayer的关联
 */
public interface AdvancedMediaPlayer {

    /**
     *
     * @param fileName
     */
    public void playAvi(String fileName);

    /**
     *
     * @param fileName
     */
    public void playMp4(String fileName);
}

  1. 具体实现
package com.guoguo.structural.bridgepattern.advancedimpl;

import com.guoguo.structural.bridgepattern.AdvancedMediaPlayer;

/**
 * @ClassName AviPlayer
 * @Description TODO
 * @Author MPED
 * @Date 2021/9/3 23:09
 * @Version 1.0
 **/
public class AviPlayer implements AdvancedMediaPlayer {

    @Override
    public void playAvi(String fileName) {

        System.out.println("播放Avi:"+fileName);
    }

    @Override
    public void playMp4(String fileName) {

    }
}


/**
 * @ClassName Mp4Player
 * @Description TODO
 * @Author MPED
 * @Date 2021/9/3 23:11
 * @Version 1.0
 **/
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playAvi(String fileName) {

    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("播放MP4:" + fileName);
    }
}

  1. 适配器类

/**
 * @ClassName MediaAdapter
 * @Description 适配器类
 * @Author MPED
 * @Date 2021/9/3 23:15
 * @Version 1.0
 **/
public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType){
        if (audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer = new Mp4Player();
        }

        if (audioType.equalsIgnoreCase("avi")){
            advancedMediaPlayer = new AviPlayer();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp4")){
            advancedMediaPlayer.playMp4(fileName);
        }

        if (audioType.equalsIgnoreCase("avi")){
            advancedMediaPlayer.playAvi(fileName);
        }
    }
}

  1. API类

/**
 * @ClassName AudionPlayer
 * @Description TODO
 * @Author MPED
 * @Date 2021/9/3 23:26
 * @Version 1.0
 **/
public class AudionPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;

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

        if ("mp3".equalsIgnoreCase(audioType)){
            System.out.println("播放MP3:" + fileName);
        }else if ("avi".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)){

            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType,fileName);
        }else {
            System.out.println("Invalid media:" + audioType);
        }





    }
}

  1. 调用
**
 * @ClassName Test
 * @Description TODO
 * @Author MPED
 * @Date 2021/9/3 23:36
 * @Version 1.0
 **/
public class Test {

    public static void main(String[] args) {
        MediaPlayer mediaPlayer = new AudionPlayer();
        /**
         * 通过下面的方法能明显看出来桥接模式的弊端:我明明调用的是AudionPlay。但是内部根据文件类型,
         * 又选择了其他实现类,如果这种情况多的话,维护起来真的是头发一抓一大把。
         */
        mediaPlayer.play("mp3","欢喜中国年.mp3");
        mediaPlayer.play("mp4" ,"奥特曼打小怪兽.mp4");
        mediaPlayer.play("avi","变形金刚大战奥特曼.avi");
        mediaPlayer.play("svf","猫吃鱼狗吃肉奥特曼打小怪兽.svf");
    }
}
  1. 结果
播放MP3:欢喜中国年.mp3
播放MP4:奥特曼打小怪兽.mp4
播放Avi:变形金刚大战奥特曼.avi
Invalid media:svf

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿每日分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值