结构型设计模式之桥接模式

一、模式概述

桥接模式是一种结构型设计模式,其核心思想是将功能或类的设计拆分成抽象层实现层两个独立的层次结构,使它们可以独立变化和扩展,从而提高系统的灵活性和可维护性。

  • 抽象层:负责定义接口,明确需要完成的工作和提供的功能,关注的是“做什么”。
  • 实现层:具体负责实现抽象层定义的功能,关注的是“怎么做”。
二、应用场景案例:多图形后端窗口渲染

以创建窗口并渲染图片的应用为例,该应用需要在不同的图形后端(ReLip 图形库和 Ecx 图形库)上实现相同的窗口渲染功能,包括初始化窗口、加载图片、显示图片、检查退出条件和关闭窗口等。

三、桥接模式的实现步骤
1. 定义实现层接口(Graphic 接口)

定义了一个 Graphic 接口,该接口规定了实现图形窗口所需的基本功能方法,具体如下:

  • initialWindow:初始化窗口
  • loadImage:加载图片
  • putImage:显示图片
  • isQuit:检查是否需要退出
  • closeWindow:关闭窗口并退出
2. 实现具体的实现类(Ecx 和 ReLip 图形库)
  • Ecx 图形库:实现了 Graphic 接口,完成了在 Ecx 图形后端上初始化窗口、加载图片、显示图片、检查退出和关闭窗口等具体逻辑。例如,在初始化窗口时可能需要进行特定的设置,在加载图片时使用 Ecx 库的相应方法,在显示图片时也有其独特的绘制方式,检查退出条件可能依赖于 Ecx 库提供的事件机制,关闭窗口则调用 Ecx 库的关闭方法。
  • ReLip 图形库:同样实现了 Graphic 接口,完成了在 ReLip 图形后端上的各项功能。它有自己初始化窗口的方法(如 initialWindow 可设置宽高和标题),加载图片时使用 new Texture2D 并调用 loadTexture 方法,显示图片使用 drawTexture 方法,检查退出使用自带的 windowShouldClose 方法,关闭窗口调用 closeWindow 方法。不过,ReLip 库可能存在一些小问题,如在同一个进程中与 Ecx 库的默认渲染可能产生冲突,导致闪屏,但这在实际业务中较少出现,因为一般不会在同一个进程未重启的情况下频繁切换图形后端。
3. 定义抽象层类(Window 类)
  • Window 类是抽象层,它创建指定大小的窗口,并调用内部 Graphic 实现的具体方法来完成窗口的创建和渲染工作。
  • Window 类的构造函数中调用 initialWindow 方法初始化窗口。
  • 提供 loadImage 方法,将图片通过对应图形后端的实现加载到成员变量中。
  • run 方法实现了主循环,在没有退出条件时显示图片并延迟一定时间,主循环退出后关闭窗口。Window 类在运行时依赖 Graphic 接口,而不关心具体的实现类是 Ecx 还是 ReLip。
4. 客户端代码(入口类)
  • 在入口类中,创建了两个窗口,对应两个不同的图形后端(Ecx 和 ReLip)。
  • 对于每个窗口,在启动时首先实例化对应的图形后端对象(如 Ecx 或 ReLip 的 Graphic 实现类),然后将该对象传递给 Window 类来创建窗口。
  • 可以发现,客户端代码中创建窗口、加载图片和运行窗口的主循环等部分的代码结构基本相同,只是传入的图形后端对象不同。这体现了桥接模式的优点,即一旦抽象层和实现层的接口封装完成,客户端业务逻辑代码可以保持不变,只需传入不同的实现对象即可。
四、桥接模式的关键要素
  • 抽象:由 Window 类代表,定义了高层的业务逻辑和操作接口,如创建窗口、加载图片和运行窗口等,它依赖于抽象的 Graphic 接口,而不关心具体的实现细节。
  • 实现:由 Graphic 接口及其具体实现类(Ecx 和 ReLip 图形库)代表,负责实现具体的功能,如初始化窗口、加载和显示图片等。不同的实现类可以提供不同的实现方式,但都遵循 Graphic 接口定义的规范。
五、桥接模式的优点
  • 分离抽象与实现:将业务逻辑的抽象部分和具体实现部分分离,使它们可以独立变化和扩展。例如,可以方便地添加新的图形后端(新的实现类),而无需修改 Window 类的代码;也可以在不改变图形后端实现的情况下,修改窗口的业务逻辑(抽象层)。
  • 提高灵活性和可扩展性:可以灵活地组合不同的抽象和实现,满足不同的需求。在案例中,可以轻松地在 Ecx 和 ReLip 两个不同的图形后端之间切换,为系统提供了更多的选择和扩展性。
  • 符合开闭原则:对扩展开放,对修改关闭。当需要添加新的图形后端或修改窗口的业务逻辑时,可以通过添加新的类来实现,而无需修改现有的代码。
六、桥接模式的缺点
  • 增加类的数量:引入了抽象层和实现层,以及它们之间的关联,可能会导致类的数量增多,增加了系统的复杂度和代码的理解难度。
  • 设计复杂度增加:需要正确地划分抽象层和实现层,设计合理的接口和类结构,否则可能会导致系统的耦合度增加,降低系统的可维护性。
七、总结

桥接模式通过将功能或类的设计拆分成抽象层和实现层,实现了两者的解耦和独立变化,提高了系统的灵活性、可扩展性和可维护性。在实际应用中,当一个系统需要在不同的实现方式之间进行切换,或者需要将业务逻辑和具体实现分离时,可以考虑使用桥接模式。但在使用时也需要注意控制类的数量和设计复杂度,以确保系统的可维护性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值