桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。(来源百度百科)
这个看起来很抽象,举个例子说明。有两个人,一个白领,一个运动员,两个人都有着装的需求,一个穿西服,一个穿运动服。这样正常来说,可以定一个抽象类——人,然后两个实现类白领和运动员,然后在两个实现类中各实现穿西服和穿运动服的逻辑。
缺点:具体的人对象与着装的行为变成了强耦合关系,修改和扩展都不方便;说不定哪天白领去吃做运动,穿运动服,这时候就需要改变具体白领实现类代码。
如果使用桥接模式呢,还是抽象出一个人类,但是呢,对着装的行为抽象出一个接口,同时定义好接口的实现类(穿西服,穿运动服等)。在这个抽象人类中组合一个着装的行为接口。当白领或者运动员继承抽象人类后,当需要着装的时候,不需要去实现里面的逻辑,只要赋予一个着装的具体实现对象即可。
这样对应定义,将着装这部分抽象成一个接口,使得白领或者运动员无需自己实现这一接口,只要赋予一个着装的具体实现即可实现功能。两者就都可以独立的变化了。
该模式实现了,对象与具体行为的强耦合关系的解耦,两者都能独立的变化。
角色:
1)行为接口类;
2)行为接口具体实现类;
3)抽象类;
4)抽象实现类;
5)使用者。
使用前文所述的场景,代码示例如下,php编码。

<?php /* * 桥接模式示例 */ error_reporting(E_ALL); ini_set('display_errors','on'); preg_match("/cli/i", php_sapi_name()) ? define('LINE_BREAK', PHP_EOL) : define('LINE_BREAK', "<br/>"); /* * 角色:行为接口 * 穿衣打扮接口 */ interface DressAPI{ public function dressCloth(); } /* * 角色;行为具体实现类 * 穿西服 */ class DressWithSuit implements DressAPI{ public function dressCloth(){ echo "穿西服".LINE_BREAK; } } /* * 角色;行为具体实现类 * 穿运动服 */ class DressWithSportsCloth implements DressAPI{ public function dressCloth(){ echo "穿运动服".LINE_BREAK; } } /* * 角色:抽象类 * 人 */ abstract class Person{ private $_dressAPI; public function __construct(DressAPI $dressAPI) { $this->_dressAPI = $dressAPI; } public function getDressAPI(){ return $this->_dressAPI; } public function setDressAPI(DressAPI $dressAPI){ $this->_dressAPI = $dressAPI; } public abstract function Dress(); } /* * 角色:抽象实现类 * 白领 */ class Officer extends Person{ public function __construct(DressAPI $dressAPI) { parent::__construct($dressAPI); echo "我是一个白领".LINE_BREAK; } public function Dress(){ $this->getDressAPI()->dressCloth(); } } /* * 角色:抽象实现类 * 运动员 */ class Athlete extends Person{ public function __construct($dressAPI) { parent::__construct($dressAPI); echo "我是一个运动员".LINE_BREAK; } public function Dress(){ $this->getDressAPI()->dressCloth(); } } /* * 角色:使用者 */ $officer = new Officer(new DressWithSuit());//我是一个白领 $athlete = new Athlete(new DressWithSportsCloth());//我是一个运动员 $officer->Dress();//穿西服 $athlete->Dress();//穿运动服 $officer->setDressAPI(new DressWithSportsCloth()); $officer->Dress();//穿运动服
参考文档: