PHP设计模式(十一)桥接模式的实现

作者: 温新

分类: 【设计模式】

阅读: 1972

时间: 2020-04-18 08:27:48

一、什么是桥接模式(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日

请登录后再评论