在 Unity 开发中, 桥接模式 (Bridge Pattern) 用于处理多维度独立变化的场景 —— 当一个类存在两个或多个独立变化的维度时, 通过 “桥接” 姜抽象部分鱼实现分离, 是两者可以独立扩展, 避免因组合过多而导致 “类爆炸”
举个具体场景: 角色与武器系统
假设你在开发一款 RPG 游戏, 有两个核心维度需要设计:
- 角色类型: 战士\法师\弓箭手 (冲向维度, 代表”谁来用”)
- 武器类型: 剑\法杖\弓箭 (实现维度, 代表 ”用什么”)
如果直接将两者耦合 (比如
WarriorWithSowrd \ MageWithStaff \ ArcherWithBow …), 当角色或武器类型增加时, 类的数量会指数级增长 (比如新增”枪”和”刺客”, 需要新增 AssassinWithSword \ AssassinWithGun 等), 维护成本极高.桥接模式的解决思路是: 用一个”桥”将角色(抽象)和武器(实现)分离, 让两者各自独立变化.
桥接模式的核心角色
- 抽象化(Abstraction): 定义抽象类, 持有”实现化”对象的引用(桥接点),并声明抽象方法(如”使用武器”)
- 扩展抽象化(Refined Abstraction): 抽象类的具体实现(如武器的”攻击”行为).
- 实现化(Implementor): 定义实现层的接口(如武器的”攻击”行为)
- 具体实现化(Concrete Implementor): 实现层接口的具体类(如剑\法杖).
代码实现步骤
- 定义实现化接口(武器的行为)
先定义武器(实现维度)的接口, 规定所有武器必须有”攻击”方法:
- 实现具体武器(具体实现化)
为每种武器实现 IWeapon 接口(独立扩展实现维度):
- 定义抽象化角色(桥接的核心)
抽象角色类持有 IWeapon 的引用(这就是”桥”), 并声明”使用武器”的抽象方法:
- 实现具体角色 (扩展抽象化)
具体角色类继承 Character, 实现”使用武器”的逻辑(独立扩展抽象为度):
- 在 Unity 中使用(客户端)
在游戏逻辑中, 通过组合角色和武器实现功能, 且可动态切换:
桥接模式解决的核心问题
- 避免类爆炸: 如果不用桥接, 角色与武器的组合需要
3种角色 x 3种武器 = 9个类;用桥接后, 只需3角色 + 3武器 = 6个类, 且新增角色\武器时只需各加1个类(比如新增”枪”和”刺客”,只需加Gun和Assassin,无需修改其他类).
- 独立扩展: 角色维度(战士\法师)和武器维度(剑\法杖)可以各自独立变化, 互不影响.
- 动态组合: 通过
ChangeWeapon方法, 角色可以在运行时动态切换武器(桥接的灵活性).
桥接模式 vs 适配器模式
- 桥接模式: 提前设计, 将两个独立变化的维度分离, 让它们独立扩展(”预防类爆炸”)
- 适配器模式: 事后兼容, 将现有不兼容的接口转换为统一接口(”解决已有冲突”).
在Unity中, 桥接模式常用于: 角色与技能系统\UI主题与控件\多平台功能适配(如不同平台的支付接口 + 不同商品类型)等多维度变化场景.