前言
学习设计模式,我强烈推荐借鉴5W1H的方法,因为干巴巴的看很难理解其中的精髓,很容易陷入一种“看山是山”的境地,无法深刻体会其中的奥妙和玄机。
桥接模式属于结构型模式,重要程度三颗星(心):💕💕💕
一、为什么用(WHY)
现在有一些类或者接口不能在一起工作
二、解决什么问题(WHAT)
需要将原来不能一起工作的类或者接口使其能够一起工作,去解决问题。
1、系统想要使用一个类,但是这个类不满足当前的需求。
2、想要建立一个可以复用的类,将一些没啥关系的类结合起来使用,这些源类不一定有一致的接口
3、通过接口转换,将一个类转换到另外一个类中(这个地方是从别的地方搜集的,我感觉用组合的方式更优雅,欢迎各位大佬雅正)
三、在什么地方用(WHERE)
碰见第二部分的问题的地方或者问题的类的地方用
四、什么时候用(WHEN)
碰见第二部分的问题的时候用
五、谁用(WHO)
需要解决问题的人,当然是可爱的程序员我们了。
六、怎么用(HOW)
6.1 类图
但从这个类图来看很难梳理出来个一二三。
6.2 具体实现
要具体的工程代码,请点击她,github地址,代码持续更新,后边会完善23种设计模式的具体实现,有兴趣的朋友,可以关注【程序猿每日分享】公众号,一起happy,一起浪。
- 无关类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);
}
- 具体实现
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);
}
}
- 适配器类
/**
* @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);
}
}
}
- 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);
}
}
}
- 调用
**
* @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");
}
}
- 结果
播放MP3:欢喜中国年.mp3
播放MP4:奥特曼打小怪兽.mp4
播放Avi:变形金刚大战奥特曼.avi
Invalid media:svf
Process finished with exit code 0