结构型模式----桥接模式

1.由来

设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:

  • 第一种设计方案是为每一种形状都提供一套各种颜色的版本。
  • 第二种设计方案是根据实际需要对形状和颜色进行组合

对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。(我喜欢叫他拼凑模式,先抽取共同点,然后用共同点去拼凑)

2.定义

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

3.代码的实现

抽象车

public abstract class AbstractCar {

  protected Transmission gear;

  public abstract void run();

  public void setTransmission(Transmission gear) {
    this.gear = gear;
  }

}

按品牌分,BMW牌车

public class BMWCar extends AbstractCar{

  private static final Logger LOG = LoggerFactory.getLogger(BMWCar.class);

  @Override
  public void run() {
    gear.gear();
    LOG.info("BMW is running");
  };

}

BenZCar

public class BenZCar extends AbstractCar{

  private static final Logger LOG = LoggerFactory.getLogger(BenZCar.class);

  @Override
  public void run() {
    gear.gear();
    LOG.info("BenZCar is running");
  };

}

抽象变速器

public abstract class Transmission{

  public abstract void gear();

}

手动档

public class Manual extends Transmission {

  private static final Logger LOG = LoggerFactory.getLogger(Manual.class);

  @Override
  public void gear() {
    LOG.info("Manual transmission");
  }
}

自动档

public class Auto extends Transmission {

  private static final Logger LOG = LoggerFactory.getLogger(Auto.class);

  @Override
  public void gear() {
    LOG.info("Auto transmission");
  }

有了变速器和品牌两个维度各自的实现后,可以通过聚合,实现不同品牌不同变速器的车,如下

public class BridgeClient {

  public static void main(String[] args) {
    Transmission auto = new Auto();
    AbstractCar bmw = new BMWCar();
    bmw.setTransmission(auto);
    bmw.run();

    Transmission manual = new Manual();
    AbstractCar benz = new BenZCar();
    benz.setTransmission(manual);
    benz.run();
  }

}

4.模式的优点

  • 分离抽象接口及其实现部分。
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

5.模式的缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 - 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

6.应用场景

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

参考:http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/bridge.html

http://www.jasongj.com/design_pattern/bridge/

时间: 2024-11-05 18:58:37

结构型模式----桥接模式的相关文章

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

第9章 结构型模式—桥接模式

1. 桥接模式(Bridge Pattern)的定义 (1)将抽象部分与它的实现部分分离,使它们都可以独立地变化 ①一般的“抽象”与“实现”是指父子类的继承关系.但这里,GoF所谓的“抽象”是如果引起一个类变化是多维度的因素(设为2维),就将其他变化因素抽象成一个接口,在“Abstraction类”中只留这个接口,然后通过对象组合(而不是继承)的方式去依赖这个接口.而“实现”是指在让另一个“Implementor类”的子类去实现接口(第2维度的变化). ② “Abstraction类”和“Imp

java设计模式--结构型模式--桥接模式

1 桥接模式 2 概述 3 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 4 5 6 适用性 7 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 8 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. 9 10 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充. 11 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充. 12 13 3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译.

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使

设计模式(结构型)之代理模式(Proxy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之享元模式(Flyweight Pattern)>http://blog.csdn.net/yanbober/article/details/45477551 概述 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个

&quot;围观&quot;设计模式(15)--结构型之桥梁模式(Bridge Pattern)

桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为.具体特征分离开来,使它们可以各自独立的变化.事物对象仅是一个抽象的概念.如"圆形"."三角形"归于抽象的"形状"之下,而"画圆"."画三角"归于实现行为的"画图"类之下,然后由"形状"调用"画图".----WIKIPEDIA 个人理解 桥梁模式的核心在于解耦,通过抽象化将具体的事物

【结构型】Bridge模式

桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化.简简单单的一句话,却已经是站在了更高抽象层面上来看待.设计.解决问题.平常我们多是对具体问题进行分析.抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可.这种情况下的结构关系图参考如下: 这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要

提高C++编译速度-------pimpl 模式&amp; 桥接模式(转)

pimpl 模式(Private Implementation),我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这会是个麻烦事儿.Pimpl机制,顾名思义,将实现私有化,力图使得头文件对改变不透明. 桥接模式(bridge)是一种结构型设计模式,它把类的具体实现细节对用户隐藏起来,以达到类之间的最小耦合关系.在具体编程实践中桥接模式也被称为pimpl或者handle/body惯用法,它可以将头文件的依赖关系降到

结构化设计模式-桥接模式

桥接模式目的:将抽象的对象,和具体的实现相分离,同时使用组合代替继承(很有用的设计模式,符合单一职责,开闭等原则). 桥接模式对象 Bridge-pattern Abstraction,抽象类:抽象化给出的定义,并保存对实例化对象的引用 RefinedAbstraction,扩充抽象类:扩充抽象化角色,改变和修正父类对抽象化定义 Implementor,实现接口类:这个角色给出实现化角色的接口,不给出具体实现.这个接口和抽象话接口不相同,这个接口给出底层的实现操作定义,而抽象化接口给出类基本或上