设计模式之桥接模式

桥接模式

定义:将抽象与实现分离,使他们可以独立变化,它是组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度

桥接模式主要角色如下:

抽象化角色:定义抽象类,并包含一个对实现化对象的引用

扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法

实现化角色:定义实现化角色的接口,供扩展抽象化角色调用

具体实现化角色:给出实例化角色接口的具体实现


案例代码实现

需要开发一个跨平台视频播放器,可以在不同的操作系统平台上播放多种格式的视频文件,常见的视频格式包括RMVB,AVI,WMV等,该播放器包含了两个维度,适合使用桥接模式

案例实现类图如下

image-20220602100524842

代码实现如下:

定义抽象化角色类,操作系统类OpratingSystem

public abstract class OpratingSystem {
  //组合实现化角色对象的引用
  protected VideoFile videoFile;

  public OpratingSystem(VideoFile videoFile){
       this.videoFile=videoFile;
  }

  public abstract void play(String fileName);
}

定义扩展抽象化角色,Mac操作系统类Mac

public class Mac extends OpratingSystem{

  public Mac(VideoFile videoFile){
       super(videoFile);
  }
  @Override
  public void play(String fileName) {
       System.out.println("使用Mac操作系统播放"+videoFile.decoding(fileName));
  }
}

定义扩展抽象化角色,Windows操作系统类Windows

public class Windows extends OpratingSystem{

  public Windows(VideoFile videoFile) {
       super(videoFile);
  }

  @Override
  public void play(String fileName) {
       System.out.println("使用Windows系统播放"+videoFile.decoding(fileName));
  }
}

定义实现化角色,视频解码器类VideoFile

public interface VideoFile {
  //实现视频文件的解码操作
  String decoding(String fileName);
}

定义具体实现化角色,AVI格式文件类AviFile

public class AviFile implements VideoFile{

  @Override
  public String decoding(String fileName) {
       return "AVI视频文件:"+fileName;
  }
}

定义具体实现化角色,RMV格式文件类RmvFile

public class RmvFile implements VideoFile{
  @Override
  public String decoding(String fileName) {
       return "RMV视频文件:"+fileName;
  }
}

测试类

public static void main(String[] args) {
   OpratingSystem system=new Mac(new AviFile());

   system.play("战狼3");
}

优点

桥接模式提高了系统的可扩充性,在两个变化的维度中任意扩展一个维度,都不需要修改原有系统,如:如果现在还有一种视频文件格式wmv,我们只需要在定义一个类实现VideroFile接口即可,其他类不需要改动


使用场景

当一个类存在两个独立变化的维度时,且两个维度都需要进行扩展时,上诉例子中的播放器类存在的两个维度就是电脑的操作系统和音频文件的格式编码

当一个系统不希望使用继承或因为多层次继承导致系统类的个数几句增加时

当一个系统需要在构件的抽象化角色和具体实现化角色之间增加更多的灵活性时,避免两个层次之间建立静态的继承关系,通过桥接模式可以使他们在抽象层建立一个关联关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值