概述
桥接模式是一种结构型设计模式,它将抽象部分和实现部分分离,使它们可以独立变化。通过桥接模式,可以将抽象部分和实现部分进行组合,而不是继承关系,从而使系统更加灵活。
适用场景
桥接模式适用于以下情况:
- 当一个类存在多个维度的变化,且这些维度可以独立变化时。
- 当希望在抽象部分和实现部分之间建立一个稳定的关联关系,而不希望二者紧密耦合时。
- 当希望在运行时动态地切换抽象部分和实现部分的时候。
结构
桥接模式由以下组件组成:
- 抽象类(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)实现了实现接口,提供具体的实现。
通过使用桥接模式,我们可以将抽象部分和实现部分独立变化,通过组合的方式将它们进行连接。这样一来,当抽象部分或实现部分发生变化时,它们可以独立变化,而不会相互影响。