桥接模式(Bridge Pattern):
  将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

桥接模式包含如下角色:
  Abstraction:抽象类
  RefinedAbstraction:扩充抽象类
  Implementor:实现类接口
  ConcreteImplementor:具体实现类

UML图:

  

理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

代码实现:

<?php
//抽象化角色,抽象化给出的定义,并保存一个对实现化对象的引用。
abstract class Abstraction {/* 对实现化对象的引用 */protected $imp;//其操作方法public function operation() {$this->imp->operationImp();}
}
//修正抽象化角色,扩展抽象化角色,改变和修正父类对抽象化的定义。
class RefinedAbstraction extends Abstraction {public function __construct(Implementor $imp) {$this->imp = $imp;} //操作方法在修正抽象化角色中的实现public function operation() {echo 'RefinedAbstraction operation  ';$this->imp->operationImp();}
}//实现化角色,给出实现化角色的接口,但不给出具体的实现。
abstract class Implementor {//操作方法的实现化声明abstract public function operationImp();
}//具体化角色A,给出实现化角色接口的具体实现
class ConcreteImplementorA extends Implementor {//操作方法的实现化实现public function operationImp() {echo 'Concrete implementor A operation <br />';}
}//具体化角色B  给出实现化角色接口的具体实现
class ConcreteImplementorB extends Implementor {//操作方法的实现化实现public function operationImp() {echo 'Concrete implementor B operation <br />';}
}

具体实例:

//实现各种操作系统都能播放MPEG,AVI,WMV格式的视频
//抽象类,定义操作系统
abstract class OperationSystem{public $musicPattern; function playMpeg(){$this->musicPattern->playMpeg();}function playWmv(){$this->musicPattern->playWmv();}function playAvi(){$this->musicPattern->playAvi();}
}//扩展抽象类,定义Linux的播放模式
class linux extends OperationSystem{function __construct(MusicPattern $musicPattern){$this->musicPattern = $musicPattern;}
}
//扩展抽象类,定义Linux的播放模式
class Windows extends OperationSystem{function __construct(MusicPattern $musicPattern){$this->musicPattern = $musicPattern;}
}
//扩展抽象类,定义Unix的播放模式
class Unix extends OperationSystem{function __construct(MusicPattern $musicPattern){$this->musicPattern = $musicPattern;}
}//实现类接口
abstract class MusicParrenInterface{abstract function playMpeg();abstract function playWmv();abstract function playAvi();
}
//具体实现类
class MusicParren extends MusicParrenInterface{function playMpeg(){echo "播放Mpeg格式的视频";}function playWmv(){echo "播放Wmv格式的视频";}function playAvi(){echo "播放Avi格式的视频";}}//测试
$operationSystem = new Windows(new MusicPattern());
$operationSystem->playMpeg();
$operationSystem->playAvi();

优点:
  分离抽象接口及其实现部分。
  桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  实现细节对客户透明,可以对用户隐藏实现细节。
缺点:
  桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进
  行设计与编程。 - 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

适用环境:
  如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
  对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

转载于:https://www.cnblogs.com/yujon/p/5534793.html

桥接模式和php实现相关推荐

  1. 桥接模式和路由模式区别_【微课堂】路由器设置:桥接模式vs路由模式

    每天接话总有用户要桥接改路由,路由改桥接,改完要提醒重设路由器,否则就要重复呼入,可是怎么设置呢?到底哪个模式更好呢? 小万别着急.今天,我们就来学习一下光猫连接,不同模式下路由器的设置方法. 设置路 ...

  2. 设计模式之桥接模式(Bridge)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. 虚拟机无法使用网卡桥接模式

    重装了好几遍操作系统,换了两个虚拟机,差点怀疑人生-- 最终的原因竟然是win10!!! 1.执行WIN+R 输入services.msc,打开服务管理器(回车). 2.找到Device Instal ...

  4. (转载)深入浅出设计模式——桥接模式(Bridge Pattern)

    模式动机设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状都提供一套 ...

  5. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  6. red hat关于桥接模式连不上外网或者没有IP

    很多人·在启动虚拟机后连接不上外网,即ifconfig没有ip地址,我总结了一下需要注意的地方: 以下全是在桥接模式. 1.在windows中打开任务管理器-->服务中找到一下几个服务,确保它们 ...

  7. 桥接模式(Bridge)

    桥接模式:将抽象部分与它的实现部分分离,使它们能够独立地变化 应用桥接模式解决问题的思路: 假设这样一个应用场景,消息发送模块,消息可以分为普通消息-->加急消息-->特急消息,而发送消息 ...

  8. VM虚拟机桥接模式无法联网解决办法

    1.背景介绍: 桥接模式----使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了: 因此,虚拟机设置为桥接模式,且设为静态IP,这样以后就可以方便的使用虚 ...

  9. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  10. Net设计模式实例之桥接模式( Bridge Pattern)(2)

    四.桥接模式实例分析(Example) 1.场景 业务对象(BusinessObject)与数据对象(DataObject)分离,即业务对象CustormerBase与数据对象DataObject分离 ...

最新文章

  1. 【题解】CF#611 H-New Year and Forgotten Tree
  2. 使用Speedment和Spring创建REST API
  3. java nio doug_深入的聊聊 Java NIO
  4. linux 系统怎么安装vnc,在Linux系统中安装和使用VNC
  5. 设计模式之蝉——代理模式上中
  6. Cannot subclass final class class com.sun.proxy.$Proxy16
  7. 总结4月13日密室逃脱后至今复习的内容(夯实基础,构建知识脉络)
  8. 设计模式(9)----- 创建型模式-----工厂设计模式(抽象工厂模式)
  9. STL学习笔记--歌唱比赛(综合题)
  10. 【攻略】舰これ辅助程式介绍-航海日志
  11. wps压缩word文档方法
  12. IAR Systems 历史版本下载地址
  13. 大型网站的静态化处理
  14. jQuery下载所有版本(实时更新……)
  15. 保你学会Springboot如何前后端分离地传输数据!(后端,前端的坑过几天填上)
  16. 观察者模式与推拉模型
  17. 华为西安鲲鹏服务器项目,眼见为实,华为鲲鹏架构服务器生态大揭秘
  18. C# TaskFactory.StartNew 方法
  19. IPv6连接类型Native Static、Native DHCPv6、Tunnel 6in4、Tunnel 6to4、Tunnel 6rd的区别
  20. words and sentences

热门文章

  1. Lc123验证是不是回文序列
  2. android开发比例图表,Android开发中如何使用绘制图表
  3. 电商网站模板_微购物商城网站建设:要做好这6点!
  4. 分治法 —— 快速排序和归并排序(自底向上和自顶向下)
  5. C++ STL bitset类常用函数的使用
  6. python深度学习库keras——安装
  7. java中生成pdf,插入图片,页眉、页脚、表格
  8. Python: SystemError: Unknown opcode
  9. java stream collect_java流stream中的collect()方法详解
  10. Spark算子与RDD基本转换