桥接模式(Bridge)—— 外卖平台和支付方式,组合搭桥
大白话解释
你点外卖时,有两个东西可以自由选:
- 点餐平台(美团 / 饿了么)
- 支付方式(微信 / 支付宝 / 银行卡)
👉 注意:
- 你可以 美团 + 微信
- 也可以 美团 + 支付宝
- 也可以 饿了么 + 微信
- 也可以 饿了么 + 银行卡
❌ 如果用继承硬写,会变成:
- 美团-微信支付类
- 美团-支付宝类
- 饿了么-微信支付类
- 饿了么-银行卡类
…
👉 组合一多,直接爆炸 💥
✅ 桥接模式怎么解决?
👉 把两个维度拆开:
平台(抽象部分)
👉 只负责:下单流程
支付方式(实现部分)
👉 只负责:怎么付钱
👉 平台“拿着”支付方式,这就是桥
桥接模式:把抽象部分和实现部分分离,让它们可以独立地变化。避免因为"两个维度的变化"导致类数量爆炸。
常见场景:
- UI 主题(深色/浅色)× 平台(Windows/Mac/Linux)
- 消息(普通消息/加密消息)× 发送渠道(短信/邮件/推送)
- 外卖平台(美团/饿了么) x 支付方式(微信/支付宝/银行卡)
C++ 代码示例
场景:外卖平台可以通过不同支付方式(微信/支付宝/银行卡)支付。
#include <iostream>
#include <memory>
#include <string>
// ==============================
// 支付方式(实现部分)
// ==============================
class Payment {
public:
virtual void pay(int amount) = 0;
virtual ~Payment() = default;
};
class WeChatPay : public Payment {
public:
void pay(int amount) override {
std::cout << "用微信支付 " << amount << " 元\n";
}
};
class AliPay : public Payment {
public:
void pay(int amount) override {
std::cout << "用支付宝支付 " << amount << " 元\n";
}
};
// ==============================
// 外卖平台(抽象部分)
// ==============================
class FoodPlatform {
protected:
std::shared_ptr<Payment> payment; // 🌉 桥
public:
FoodPlatform(std::shared_ptr<Payment> p) : payment(p) {}
virtual void orderFood(int amount) = 0;
};
// ==============================
// 美团
// ==============================
class Meituan : public FoodPlatform {
public:
using FoodPlatform::FoodPlatform;
void orderFood(int amount) override {
std::cout << "[美团] 下单成功\n";
payment->pay(amount);
}
};
// ==============================
// 饿了么
// ==============================
class Eleme : public FoodPlatform {
public:
using FoodPlatform::FoodPlatform;
void orderFood(int amount) override {
std::cout << "[饿了么] 下单成功\n";
payment->pay(amount);
}
};
// ==============================
// 使用
// ==============================
int main() {
auto wechat = std::make_shared<WeChatPay>();
auto alipay = std::make_shared<AliPay>();
// 美团 + 微信
Meituan m1(wechat);
m1.orderFood(30);
// 饿了么 + 支付宝
Eleme m2(alipay);
m2.orderFood(50);
return 0;
}
输出:
[美团] 下单成功
用微信支付 30 元
[饿了么] 下单成功
用支付宝支付 50 元
类数量对比
| 方式 | 3个平台 × 3种支付方式 |
|---|---|
| 没有桥接(直接继承) | 9 个类 |
| 使用桥接模式 | 3 + 3 = 6 个类 |
| 增加到 5个平台 × 5种支付方式 | 继承需25个,桥接只需10个 |
优缺点
| 说明 | |
|---|---|
| ✅ 优点 | 避免类爆炸,扩展方便 |
| ✅ 优点 | 可以运行时切换实现 |
| ✅ 优点 | 抽象和实现解耦,独立演进 |
| ❌ 缺点 | 增加了设计复杂度,适合变化点明确的场景 |
一句话记忆
桥接模式 = 两个都在变?拆开!别乘法爆炸,用组合搭桥。
1171

被折叠的 条评论
为什么被折叠?



