说明
在开发过程中,我们很多类具都是具有两个或多个维度以上的,例如 图形可以按照形状分,也可以按照颜色分。
在生活中也会出现很多例子,比方说:现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3 5=8个类就可以实现15支蜡笔的功能。
上面的例子可以很明显的看出来,如果不采用桥接模式的话,我随意增加颜色都会导致代码量急剧增加,并且毫无扩展性可言。我们需要把这种强关联改成弱关联,角色与角色之间应该是可以随意修改。
定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
示例
我们常见的,一个手机是可以安装多款软件,多个手机也可以随意安装多款软件,我们不可能让一个手机去只安装一个软件,软件是很灵活的,这个时候我们可以采用桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
例如: 我们两个有小米和苹果手机,可以随意安装王者荣耀和刺激战场,安装这个步骤应该是属于十分灵活的,我随时可以安装 当然也可以随时使用不同手机安装,我们来看一下实现
代码语言:javascript复制<?php
/**
* Created by 憧憬.
*/
/**
* 游戏抽象
* Class Game
*/
abstract class Game {
protected $game = null;
public function getGame()
{
return $this->game;
}
}
/**
* 手机抽象
* Class Phone
*/
abstract class Phone {
protected $game = null;
public function setGame($game)
{
$this->game = $game;
}
abstract public function play();
}
/**
* 王者荣耀
* Class WangzheRongYao
*/
class WangzheRongYao extends Game {
public function __construct()
{
$this->game = '王者荣耀';
}
}
/**
* 吃鸡
* Class HePingJingYing
*/
class HePingJingYing extends Game {
public function __construct()
{
$this->game = '和平精英';
}
}
/**
* 苹果手机
* Class IosPhone
*/
class IosPhone extends Phone {
public $phone = 'ios phone';
public function play()
{
echo 'use ' . $this->phone . ' play ' . $this->game->getGame();
}
}
/**
* 小米手机
* Class XiaoMiPhone
*/
class XiaoMiPhone extends Phone {
public $phone = 'xiaomi phone';
public function play()
{
echo 'use ' . $this->phone . ' play ' .$this->game->getGame();
}
}
$xiaoMiPhone = new XiaoMiPhone();
$xiaoMiPhone->setGame(new WangzheRongYao());
$xiaoMiPhone->play(); // use xiaomi phone play 王者荣耀
使用场景:
- 你不希望在抽象和他的实现部分之间有一个固定的邦定关系,如在程序的运行时刻实现部分应该可以被选择或者切换。
- 类的抽象以及他的视像都可以通过生成子类的方法加以扩充。这时
bridge
模式使你可以对不同的抽象接口和实现部分进行组合,并对他们进行扩充。 - 对一个抽象的实现部分的修改应该对客户不产生影响,即客户的代码不需要重新编译。
- 你想对客户完全隐藏抽象的实现部分。
- 你想在多个实现间 共享实现,但同时要求客户并不知道这一点。