桥接模式(Bridge)

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。

介绍

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

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

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

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

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

桥接与适配器模式的关系(适配器模式上面已讲解):
桥接属于聚合关系,两者关联 但不继承
适配器属于组合关系,适配者需要继承源

<?php
/**
*
*实现化角色, 给出实现化角色的接口,但不给出具体的实现。
*/
abstract class Implementor {
abstract public function operationImp();
} class ConcreteImplementorA extends Implementor { // 具体化角色A
public function operationImp() {echo "A";}
} class ConcreteImplementorB extends Implementor { // 具体化角色B
public function operationImp() {echo "B";}
} /**
*
* 抽象化角色,抽象化给出的定义,并保存一个对实现化对象的引用
*/
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() { $this->imp->operationImp(); }
} // client
$abstraction = new RefinedAbstraction(new ConcreteImplementorA());
$abstraction->operation();//输出:A
$abstraction = new RefinedAbstraction(new ConcreteImplementorB());
$abstraction->operation();//输出:B
?>

23种模式总览 : https://www.cnblogs.com/houss/p/11121584.html

最新文章

  1. HTML5 Page Visibility
  2. 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)
  3. MVC授权
  4. 关于linux发行版i386/i686/x86-64/的区别
  5. 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法
  6. PHP 高效分布代码转的
  7. linux基础命令学习(六)DHCP服务器配置
  8. hadoop学习笔记之倒排索引
  9. HW4.21
  10. Python学习(二) 运行Python,编译Python
  11. spring mvc ModelAndView向前台传值
  12. 转一篇分析C语言调用时栈的变化的好文
  13. linux下fdisk分区管理、文件系统管理、挂载文件系统等
  14. SQL注入绕WAF总结
  15. 微信小程序之mpvue+iview踩坑之旅
  16. C# MVC微信扫码支付
  17. &lt;---------------线程修改名字、得到名字及开启------------------&gt;
  18. MFC路径层的使用(BeginPath和EndPath函数)
  19. python 字符串和整数,浮点型互相转换
  20. ORACLE11G 字符集更改(这里更改为AL32UTF8)

热门文章

  1. 「NOI十联测」奥义商店
  2. Objects、Arrays、Collectors、System工具类
  3. 软件版本GA、Beta、RC含义
  4. pageX的兼容性处理2
  5. Visual Studio 下error C2471: 无法更新程序数据库
  6. TCP的报文详细解读
  7. tree目录结构
  8. VMware vSphere,ESXi和vCenter的关系和区别
  9. k8s家族Pod辅助小能手Init容器认知答疑?
  10. 忘掉cmd.exe吧!选用优雅的控制台终端(ConsoleZ)