定义:
桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
结构:
- Abstraction:抽象类。
- RefindAbstraction:被提炼的抽象类。
- Implementor:实现类。
- ConcreteImplementor:具体实现类 。
- Client:客户端代码。
代码实例:
接下来用代码实现一个颜色组合的例子,有三种颜色:黑、白、红,三种形状:圆形、正方形、长方形,可以自由组合。在这个例子中Abstraction表示形状,RefindAbstraction表示圆形、正方形、长方形,Implementor表示颜色,ConcreteImplementor表示黑、白、红。
/**
* 颜色抽象类
* Class Colour
*/
abstract class Colour
{
/**
* @return mixed
*/
abstract public function run();
}
/**
* 黑色
* Class Black
*/
class Black extends Colour
{
public function run()
{
// TODO: Implement run() method.
return '黑色';
}
}
/**
* 白色
* Class White
*/
class White extends Colour
{
public function run()
{
// TODO: Implement run() method.
return '白色';
}
}
/**
* 红色
* Class Red
*/
class Red extends Colour
{
public function run()
{
// TODO: Implement run() method.
return '红色';
}
}
/**
* 形状抽象类
* Class Shape
*/
abstract class Shape
{
/**
* 颜色
* @var Colour
*/
protected $colour;
/**
* Shape constructor.
* @param Colour $colour
*/
public function __construct(Colour $colour)
{
$this->colour = $colour;
}
/**
* @return mixed
*/
abstract public function operation();
}
/**
* 圆形
* Class Round
*/
class Round extends Shape
{
/**
* @return mixed|void
*/
public function operation()
{
// TODO: Implement operation() method.
echo $this->colour->run() . '圆形<br>';
}
}
/**
* 长方形
* Class Rectangle
*/
class Rectangle extends Shape
{
/**
* @return mixed|void
*/
public function operation()
{
// TODO: Implement operation() method.
echo $this->colour->run() . '长方形<br>';
}
}
/**
* 正方形
* Class Square
*/
class Square extends Shape
{
/**
* @return mixed|void
*/
public function operation()
{
// TODO: Implement operation() method.
echo $this->colour->run() . '正方形<br>';
}
}
// 客户端代码
// 白色圆形
$whiteRound = new Round(new White());
$whiteRound->operation();
// 黑色正方形
$blackSquare = new Square(new Black());
$blackSquare->operation();
// 红色长方形
$redRectangle = new Rectangle(new Red());
$redRectangle->operation();
// 运行结果
白色圆形
黑色正方形
红色长方形
总结:
- 桥接模式分离抽象接口及其实现部分,实现解耦,相比继承而言,无疑是一个更好的解决方案。
- 方便扩展,桥接模式相比继承而言更加灵活,减少创建类的同时还方便组合。
- 对于两个独立变化的维度,可以使用桥接模式。