PHP设计模式(十一)桥接模式的实现
一、什么是桥接模式(Bridge Pattern)
**定义:**把抽象部分与实现部分分享开来,使这可以独立变化。
**脱耦:**脱耦就是将抽象化与实现之间的耦合解脱开,简而言之,就是弱化关联,将角色继承改为关联关系。
举例理解:
武汉长江大桥通两岸。
汽车要过江到达对岸,就要有承载物,大桥就是一个很好的承载物,
桥墩是实现大桥通车的抽象,
实现桥墩抽象就是建造大桥桥墩。
桥墩建造完毕后就要实现大桥的具体功能了,
大桥的功能有:汽车通过,游客上桥一堵长江风采。
二、桥接模式结构
Abstraction(抽象类):指手机抽象类
RefinedAbstraction(扩充抽象类):指实现抽象手机类的具体类:如5g手机、3g手机
Implementor(实现接口类):这里指手机功能抽象类
ConcreteImplementor(具体实现类):这里指实现手机功能的具体类:如打电话、看视频、发短信
三、桥接模式优缺点
优点:
1)分离抽象接口及其实现部分;
2)提高了系统的可扩充性,两个变化维度中任意扩充一个,都不需要修改原有的系统;
3)实现细节对客户透明,可对用户隐藏实现细节。
缺点:
1)桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程;
2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性
四、代码实现
Mobile.php // 抽象手机类
<?php
/**
* Mobile 抽象手机类
*/
abstract class Mobile
{
// 存储具体手机实例 如5G手机,4G手机
public $phone = null;
// 初始化手机实例,且该实例对象只能来自 PhoneFunc 功能对象
public function __construct(PhoneFunc $phone)
{
$this->phone = $phone;
}
// 抽象手机功能的方法
abstract public function display();
}
FgPhone.php //实现抽象手机具体类 5g手机类
<?php
/**
* FgPhone 5G手机
*
*/
class FgPhone extends Mobile
{
/**
* 5G手机功能方法
*
* @return void
*/
public function display()
{
echo '我是5G手机,可以玩大型 ';
echo $this->phone->set();
echo '<hr>';
}
}
TgPhone.php //实现抽象手机具体类 3g手机类
<?php
/**
* FgPhone 3G手机
*
*/
class TgPhone extends Mobile
{
/**
* 3G手机功能方法
*
* @return void
*/
public function display()
{
echo '我是3G手机,可以玩普通 ';
echo $this->phone->set();
echo '<hr>';
}
}
PhoneFunc.php //抽象手机功能类
<?php
/**
* 手机手机功能
*/
abstract class PhoneFunc
{
// 设置不同手机使用不同的方法
abstract public function set();
}
FgPhoneGame.php //实现抽象手机功能具体类,实现5G功能类
<?php
/**
* 5G手机大型游戏类
*/
class FgPhoneGame extends PhoneFunc
{
// 设置5G手机可以玩大型的 云上星空竞技游戏
public function set()
{
echo ' 云上星空竞技游戏';
}
}
TgPhoneGame.php //实现抽象手机功能具体类,实现3G功能类
<?php
/**
* 3G手机可以浏览图片
*/
class TgPhoneGame extends PhoneFunc
{
// 设置5G手机可以玩大型的 云上星空竞技游戏
public function set()
{
echo ' 浏览图片';
}
}
index.php //客户端实现 <?php
include './Mobile.php';
include './FgPhone.php';
include './TgPhone.php';
include './PhoneFunc.php';
include './FgPhoneGame.php';
include './TgPhoneImg.php';
// 客户端实现
class Index
{
public static function idx()
{
// 实例化3g手机功能
$fgPhone = new FgPhone(new FgPhoneGame());
echo $fgPhone->display();
// 实例化3g手机功能
$tgPhone = new TgPhone(new TgPhoneGame());
echo $tgPhone->display();
}
}
echo Index::idx();
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2020年04月18日