详解PHP设计模式之桥接模式

 更新时间:2022年12月20日 15:01:39   作者:程序员-南  
桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下

简介

桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏向组合和聚合的方式来共享。

适用场景

不希望或不适用使用多继承的场景。

一个类存在2个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展

优点

解耦抽象和具体实现,方便增加抽象和实现。优秀的扩充能力

符合开闭原则和合成复用原则。

缺点

增加了系统的理解与设计难度。

需要正确地识别出系统中,两个独立变化的维度。

扩展

为什么要用桥接模式?

先说说继承:

如果有一个手机类作为父类A,下面有各个牌子的手机作为子类B,又有每个牌子手机旗下的内置应用类C。此时如果有3个手机的牌子,那么内置应用的父类可能有30个。

如果因为需求变需要增加手机品牌B,或者接着有第四层的D类继承第三层的内置应用类,想想这个是多么庞大的数量。后期难以维护。如果一旦父级发生变动,株连很多子类。

其实按照合成复用原则,也就是少用继承(强耦合),多用组合(弱耦合)或者聚合(中耦合)

以上的问题,可以直接拆分成两个大模块:

手机类作为抽象,手机牌子作为具体的类。

内置软件可单独抽象,每一个内置的软件作为具体的类。

然后让让两个抽象进行牵线搭桥,这边是桥接模式的思路。

案例代码

abstract class Mobile {
    abstract public function operate();
}
class HuaWei extends Mobile {
    public function operate() {
        echo '华为手机';
    }
}
class Vivo extends Mobile {
    public function operate() {
        echo 'Vivo手机';
    }
}
Abstract class Abstraction {
    protected $implementer;
    public function setImplementer ($implementer) {
        $this->implementer = $implementer;
    }
    public function run() {
        $this->implementer->operate();
    }
}
class HuaWeiApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}
class VivoApp extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}
//调用端
$ab = new HuaWeiApp();
$ab->setImplementer(new HuaWei);
$ab->run();
$ab = new VivoApp();
$ab->setImplementer(new Vivo);
$ab->run();

抽象代码

//创建一个实现
abstract class Implementer {
    abstract public function operate();
}
class ImplementerA extends Implementer {
    public function operate() {
        echo 'ImplementerA';
    }
}
class ImplementerB extends Implementer {
    public function operate() {
        echo 'ImplementerB';
    }
}
Abstract class Abstraction {
    protected $implementer;
    //用组合的方式替代继承
    public function setImplementer (Implementer $implementer) {
        $this->implementer = $implementer;
    }
    public function run() {
        $this->implementer->operate();
    }
}
class RefinedAbstraction extends Abstraction {
    public function run() {
        $this->implementer->operate();
    }
}
//调用端============================================================
$ab = new RefinedAbstraction();
$ab->setImplementer(new ImplementerA());
$ab->run();
$ab->setImplementer(new ImplementerB());
$ab->run();

到此这篇关于详解PHP设计模式之桥接模式的文章就介绍到这了,更多相关PHP桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php在多维数组中根据键名快速查询其父键以及父键值的代码

    php在多维数组中根据键名快速查询其父键以及父键值的代码

    有一个多维数组,有多少维大家可以自定义。假如我们要在这个数组中找一个键为'subIndex'的值,我们可以用for、foreach等方法遍历查找 反过来,假如我们任意给出一个或多个键,要求找出这个键的父级数组的键和值。这又如何实现?
    2011-05-05
  • 几个php应用技巧

    几个php应用技巧

    php小技巧PHP重定向
    2008-03-03
  • php打包网站并在线压缩为zip

    php打包网站并在线压缩为zip

    这篇文章主要介绍了php打包网站并在线压缩为zip的相关资料,具有一定的参考价值,需要的朋友可以参考下
    2016-02-02
  • PHP高精确度运算BC函数库实例详解

    PHP高精确度运算BC函数库实例详解

    这篇文章主要介绍了PHP高精确度运算BC函数库,结合实例形式分析了BC函数库中bccomp、bcadd、bcsub、bcmod、bcdiv、bcmul等函数的功能以及高精度数学运算使用方法,需要的朋友可以参考下
    2017-08-08
  • PHP技术开发技巧分享

    PHP技术开发技巧分享

    本文档的阅读对象是有一定经验的PHP程序员,文档中将介绍在PHP开发中的一些开发技巧,希望能对读者有一定的启发。
    2010-03-03
  • php+mysql+jquery实现简易的检索自动补全提示功能

    php+mysql+jquery实现简易的检索自动补全提示功能

    这篇文章主要介绍了php+mysql+jquery实现简易的检索自动补全提示功能,涉及基于jQuery的ajax数据库查询与事件动态响应相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • php自定义函数实现JS的escape的方法示例

    php自定义函数实现JS的escape的方法示例

    这篇文章主要介绍了php自定义函数实现JS的escape的方法,结合完整实例形式分析了php实现JS的escape功能函数的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • php获取地址栏信息的代码

    php获取地址栏信息的代码

    有时候我们需要获取地址栏的信息,然后进行另外的数据输出,下面的代码就可以
    2008-10-10
  • ThinkPHP自动验证失败的解决方法

    ThinkPHP自动验证失败的解决方法

    引用ThinkPHP2.0开发手册:ThinkPHP手册类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面,数据对象是由表单提交的$_POST数据创建。
    2011-06-06
  • PHP双向链表定义与用法示例

    PHP双向链表定义与用法示例

    这篇文章主要介绍了PHP双向链表定义与用法,涉及php使用双向链表类封装双向链表定义、读取、删除、插入等相关操作技巧,需要的朋友可以参考下
    2018-01-01

最新评论