桥接模式:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式——将抽象部分与它的实现部分分离,使他们可以独立地变化。
UML类图:
角色介绍:
抽象化(AbstractRoad)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(SpeedWay)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(AbstractCar)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。
具体实现化(Bus)角色:这个角色给出实现化角色接口的具体实现。
代码体现:
<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/4/26
* Time: 16:39
*/
/**抽象化角色 抽象路
* Class AbstractRoad
*/
abstract class AbstractRoad
{
public $icar;
abstract function Run();
}
/**具体的 高速公路
* Class speedRoad
*/
class SpeedRoad extends AbstractRoad
{
function Run()
{
$this->icar->Run();
echo ":在高速公路上。";
}
}
/**乡村街道
* Class Street
*/
class Street extends AbstractRoad
{
function Run()
{
$this->icar->Run();
echo ":在乡村街道上。";
}
}
/**抽象汽车接口
* Interface ICar
*/
interface ICar
{
function Run();
}
/**吉普车
* Class Jeep
*/
class Jeep implements ICar
{
function Run()
{
echo "吉普车跑";
}
}
/**小汽车
* Class Car
*/
class Car implements ICar
{
function Run()
{
echo "小汽车跑";
}
}
测试代码:
/------------------------桥接模式测试代码------------------
require_once "./Bridge/Bridge.php";
$speedRoad=new SpeedRoad();
$speedRoad->icar=new Car();
$speedRoad->Run();
echo "<hr/>";
$street=new Street();
$street->icar=new Jeep();
$street->Run();
适用场景:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
参考:《大话设计模式》,作者程杰
https://blog.csdn.net/jhq0113/article/details/45441793