php设计模式之桥接模式

桥接模式

把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。将抽象部分与实现部分分离,使它们都可以独立的变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。实现系统可能有多个角度分类,每一种角度都可能变化。把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

目录结构

|facade  #项目根目录
|--Think  #核心类库
|----main
|------road.php  #抽象公路角色
|------car.php  #抽象汽车接口
|----highSpeedRoad.php  #具体公路实现者 高速路
|----nationalRoad.php  #具体公路实现者 国道
|----sportsCar.php  #具体汽车车实现者 跑车
|----homeCar.php  #具体汽车实现者 家轿
|----Loder.php  #自动加载类
|--index.php #单一的入口文件

代码实践

抽象公路角色 Think/main/road.php

<?php
/**
 * 抽象公路角色
 */
namespace Think\main;

abstract class road{
    protected $_car;
    abstract function run();

    public function __construct(car $car) {
        $this->_car = $car;
    }
}

抽象汽车接口 Think/main/car.php

<?php
/**
 * 抽象汽车接口
 */
namespace Think\main;

interface car{
    function run();
}

具体公路实现者 高速路 Think/highSpeedRoad.php

<?php
/**
 * 具体公路实现者 高速路
 */
namespace Think;

use Think\main\road;

class highSpeedRoad extends road{
    public function run() {
        $this->_car->run();
        echo '开在高速路上'.PHP_EOL;
    }
}

具体公路实现者 国道 Think/nationalRoad.php

<?php
/**
 * 具体公路实现者 国道
 */
namespace Think;

use Think\main\road;

class nationalRoad extends road{
    public function run() {
        $this->_car->run();
        echo '开在国道上'.PHP_EOL;
    }
}

具体汽车车实现者 跑车 Think/sportsCar.php

<?php
/**
 * 具体汽车车实现者 跑车
 */
namespace Think;

use Think\main\car;

class sportsCar implements car{
    public function run() {
       echo "跑车";
    }
}

具体汽车实现者 家轿 Think/homeCar.php

<?php
/**
 *  具体汽车实现者 家轿
 */
namespace Think;

use Think\main\car;

class homeCar implements car{
    public function run() {
        echo '家轿';
    }
}

自动加载类 Think/Loder.php

<?php
namespace Think;

class Loder{
    static function autoload($class){
        require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
    }
}

入口文件index.php

<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');


//让跑车开在高速公路上
$highSpeedRoad = new \Think\highSpeedRoad(new \Think\sportsCar());
$highSpeedRoad->run();
//让家轿开在国道上
$nationalRoad = new \Think\nationalRoad(new \Think\homeCar());
$nationalRoad->run();

输出

跑车开在高速路上
家轿开在国道上

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

上一篇 php设计模式之外观模式
下一篇 未完待续......

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 发送提示消息## 考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统...
    七寸知架构阅读 5,088评论 5 63
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,978评论 1 15
  • 【学习难度:★★★☆☆,使用频率:★★★☆☆】直接出处:桥接模式梳理和学习:https://github.com/...
    BruceOuyang阅读 938评论 0 2
  • 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够...
    justCode_阅读 1,795评论 0 7
  • 跟你说个严肃的事。 恩,你说吧。 我们分手吧! 为什么? 没有为什么,没有理由。 已经和前女友分手四个半月了,从当...
    身穿礼服的黑乌鸦阅读 346评论 0 0