经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式(十三)----结构型模式之桥接模式
来源:cnblogs  作者:|旧市拾荒|  时间:2023/2/28 8:51:42  对本文有异议

1 概述

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:

我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。

定义:

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

2 结构

桥接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。下面中的OperatingSystem

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

  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。下面中的VidoeFile接口

  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

3 案例

【例】视频播放器

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

类图如下:

代码如下:

  1. //视频文件   实现化角色
  2. public interface VideoFile {
  3.    void decode(String fileName);
  4. }
  5. ?
  6. //avi文件 具体实现化角色
  7. public class AVIFile implements VideoFile {
  8.    public void decode(String fileName) {
  9.        System.out.println("avi视频文件:"+ fileName);
  10.   }
  11. }
  12. ?
  13. //rmvb文件 具体实现化角色
  14. public class REVBBFile implements VideoFile {
  15. ?
  16.    public void decode(String fileName) {
  17.        System.out.println("rmvb文件:" + fileName);
  18.   }
  19. }
  20. ?
  21. //操作系统版本 抽象角色
  22. public abstract class OperatingSystemVersion {
  23. ?
  24.    protected VideoFile videoFile;
  25. ?
  26.    public OperatingSystemVersion(VideoFile videoFile) {
  27.        this.videoFile = videoFile;
  28.   }
  29. ?
  30.    public abstract void play(String fileName);
  31. }
  32. ?
  33. //Windows版本 扩展抽象化角色
  34. public class Windows extends OperatingSystem {
  35. ?
  36.    public Windows(VideoFile videoFile) {
  37.        super(videoFile);
  38.   }
  39. ?
  40.    public void play(String fileName) {
  41.        videoFile.decode(fileName);
  42.   }
  43. }
  44. ?
  45. //mac版本 扩展抽象化角色
  46. public class Mac extends OperatingSystemVersion {
  47. ?
  48.    public Mac(VideoFile videoFile) {
  49.        super(videoFile);
  50.   }
  51. ?
  52.    public void play(String fileName) {
  53. videoFile.decode(fileName);
  54.   }
  55. }
  56. ?
  57. //测试类
  58. public class Client {
  59.    public static void main(String[] args) {
  60.        OperatingSystem os = new Windows(new AVIFile());
  61.        os.play("战狼3");
  62.   }
  63. }

好处:

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

    如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。

  • 实现细节对客户透明

4 使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

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

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

 

原文链接:https://www.cnblogs.com/xiaoyh/p/16559987.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号