概述

桥接模式是一种结构型设计模式,它将抽象部分和实现部分分离,使它们可以独立变化。通过桥接模式,可以将抽象部分和实现部分进行组合,而不是继承关系,从而使系统更加灵活。

适用场景

桥接模式适用于以下情况:

  • 当一个类存在多个维度的变化,且这些维度可以独立变化时。
  • 当希望在抽象部分和实现部分之间建立一个稳定的关联关系,而不希望二者紧密耦合时。
  • 当希望在运行时动态地切换抽象部分和实现部分的时候。

结构

桥接模式由以下组件组成:

  • 抽象类(Abstraction):抽象类定义了抽象部分的接口,并维护一个指向实现部分的引用。
  • 扩展抽象类(RefinedAbstraction):扩展抽象类继承自抽象类,扩展了抽象部分的功能。
  • 实现接口(Implementor):实现接口定义了实现部分的接口。
  • 具体实现类(ConcreteImplementor):具体实现类实现了实现接口,提供具体的实现。

示例

<?php

// 抽象类
abstract class Vehicle
{
protected $implementor;

public function __construct(Workshop $implementor)
{
$this->implementor = $implementor;
}

abstract public function manufacture();
}

// 扩展抽象类
class Car extends Vehicle
{
public function manufacture()
{
echo "Car ";
$this->implementor->work();
}
}

class Bike extends Vehicle
{
public function manufacture()
{
echo "Bike ";
$this->implementor->work();
}
}

// 实现接口
interface Workshop
{
public function work();
}

// 具体实现类
class Produce implements Workshop
{
public function work()
{
echo "produced";
}
}

class Assemble implements Workshop
{
public function work()
{
echo "assembled";
}
}

// 客户端代码
$car = new Car(new Produce());
$car->manufacture(); // Output: Car produced

$bike = new Bike(new Assemble());
$bike->manufacture(); // Output: Bike assembled

在上面的示例中,我们给出了一个桥接模式的示例实现。其中,抽象类(Vehicle)定义了抽象部分的接口,并维护一个指向实现部分的引用。扩展抽象类(Car和Bike)继承自抽象类,并扩展了抽象部分的功能。实现接口(Workshop)定义了实现部分的接口,具体实现类(Produce和Assemble)实现了实现接口,提供具体的实现。

通过使用桥接模式,我们可以将抽象部分和实现部分独立变化,通过组合的方式将它们进行连接。这样一来,当抽象部分或实现部分发生变化时,它们可以独立变化,而不会相互影响。