若转载教程,请注明出自SW-X框架官方文档!
<?php
/**
* 设计模式之桥接模式
* 场景:将对象与类型解耦,对象与类型之间可以随意关联调用
* 小黄牛
*/
header("Content-type: text/html; charset=utf-8");
/**
* 抽象 道路
*/
abstract class Road{
public $ICAR; // 汽车的实例
abstract public function RoRun();
}
/**
* 创建 - 高速公路
*/
class SpeedRoad extends Road{
public function RoRun(){
$this->ICAR->IcRun();
echo ':极速的行驶在高速公路上!<br/>';
}
}
/**
* 创建 - 乡村小道
*/
class StreetRoad extends Road{
public function RoRun(){
$this->ICAR->IcRun();
echo ':欢快的行驶在乡村小道上!<br/>';
}
}
/**
* 抽象接口 车
*/
interface ICAR{
function IcRun();
}
/**
* 创建 - 轿车
*/
class Car implements ICAR{
public function IcRun(){
echo '轿车';
}
}
/**
* 创建 - 马车
*/
class Carriage implements ICAR{
public function IcRun(){
echo '马车';
}
}
# 让轿车跑到 乡村小道
$speedRoad=new StreetRoad(); // 先创建乡村小道
$speedRoad->ICAR=new Car(); // 再把轿车放到马路上
$speedRoad->RoRun();
# 让马车跑到 高速公路
$street=new SpeedRoad(); // 先创建高速公路
$street->ICAR=new Carriage(); // 再把马车放到马路上
$street->RoRun();
浏览器输出
轿车:欢快的行驶在乡村小道上!
马车:极速的行驶在高速公路上!
桥接模式
抽象化(AbstractRoad)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(SpeedWay)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(AbstractCar)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。
具体实现化(Bus)角色:这个角色给出实现化角色接口的具体实现。
使用场景
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。