本文目录导读:

PHP中的桥梁模式(Bridge Pattern)主要用于解耦抽象部分和实现部分,让两者可以独立变化。
核心解耦点
解耦抽象与实现
传统继承方式的问题:
// 没有桥梁模式,使用继承
abstract class Vehicle {
abstract public function drive();
}
class Car extends Vehicle {
public function drive() {
echo "汽车在公路上行驶";
}
}
class Truck extends Vehicle {
public function drive() {
echo "卡车在公路上行驶";
}
}
// 如果要增加"水上行驶",需要创建更多子类
class AmphibiousCar extends Vehicle {
public function drive() {
echo "水陆两栖汽车在行驶";
}
}
// 类爆炸问题:2种车 × 2种路面 = 4个类
使用桥梁模式后:
// 实现部分(可独立变化)
interface Road {
public function drive();
}
class Highway implements Road {
public function drive() {
echo "在高速公路上行驶";
}
}
class Waterway implements Road {
public function drive() {
echo "在水上行驶";
}
}
// 抽象部分(可独立扩展)
abstract class Vehicle {
protected $road;
public function __construct(Road $road) {
$this->road = $road;
}
abstract public function drive();
}
class Car extends Vehicle {
public function drive() {
echo "汽车";
$this->road->drive();
}
}
class Truck extends Vehicle {
public function drive() {
echo "卡车";
$this->road->drive();
}
}
// 使用:2种车 × 2种路面 = 2 + 2 = 4个类(2个车类 + 2个路面类)
$car = new Car(new Highway());
$car->drive(); // 汽车在高速公路上行驶
$truck = new Truck(new Waterway());
$truck->drive(); // 卡车在水上行驶
解耦的具体维度
维度解耦
| 维度 | 说明 | 例子 |
|---|---|---|
| 抽象维度 | 业务逻辑层 | 车辆类型(Car、Truck、Bus) |
| 实现维度 | 具体实现层 | 道路类型(Highway、Waterway、Offroad) |
| 平台维度 | 运行环境 | Linux、Windows、macOS |
| 数据库维度 | 存储方式 | MySQL、Redis、MongoDB |
实际应用示例 - 多平台通知系统
// 实现部分:不同的消息发送渠道
interface MessageSender {
public function send($message);
}
class EmailSender implements MessageSender {
public function send($message) {
echo "通过Email发送: {$message}\n";
}
}
class SMSSender implements MessageSender {
public function send($message) {
echo "通过SMS发送: {$message}\n";
}
}
// 抽象部分:不同类型的通知
abstract class Notification {
protected $sender;
public function __construct(MessageSender $sender) {
$this->sender = $sender;
}
abstract public function notify($message);
}
class UrgentNotification extends Notification {
public function notify($message) {
echo "[紧急] ";
$this->sender->send($message);
}
}
class NormalNotification extends Notification {
public function notify($message) {
echo "[普通] ";
$this->sender->send($message);
}
}
// 动态组合
$email = new EmailSender();
$sms = new SMSSender();
$urgentEmail = new UrgentNotification($email);
$urgentSMS = new UrgentNotification($sms);
桥梁模式解决的核心问题
解决的问题清单
- 类爆炸问题:避免多维度的继承组合产生大量子类
- 可扩展性问题:新增实现或抽象不需要修改现有代码
- 耦合性问题:抽象层不依赖具体实现细节
- 复用性问题:实现部分可以独立复用,不需要绑定特定抽象
适用场景
✅ 需要跨越多个维度(如:不同类型的类 × 不同的实现方式)
✅ 运行时需要动态切换实现
✅ 抽象和实现都需要独立扩展
✅ 希望复用已有实现,避免重复代码
注意事项
- 过度设计风险:如果只有一个维度变化,使用简单继承即可
- 复杂度增加:增加了类的数量和调用层级
桥梁模式最终解耦的是"什么"(做什么)和"怎么做"(如何做)的关系,抽象部分定义业务逻辑和规则,实现部分定义具体的技术方案,两者通过组合关系连接,而非继承关系,从而获得最大的灵活性。