适配模式与桥接模式的区别和联系

两种模式的区别在于使用场合不同,适配器模式主要解决两个已有接口间的匹配问题。这种情况下被适配的接口的实现往往是一个黑匣子。我们不想,也不能改变这个接口及其实现。同时也不能控制其演化,只要相关的对象能与系统定义的接口协同工作即可。适配器模式经常用在与第三方产品的功能集成上,采用该模式适应新类型的增加的方式是开发针对这个类的适配器。


java 桥接模式 适配器模式 适配器模式和桥接模式_外观模式



图1 采用适配器模式的扩展


桥接模式则不同,参与桥接的接口是稳定的,用户可以扩展和修改桥接种的类,但是不能改变接口。桥接模式通过接口继承或者类继承实现功能的扩展。


按照GOF的说法,桥接模式和适配器模式用于设计的不同阶段,桥接模式用于设计的前期,即在设计类的时候将雷规划为逻辑和实现两大类,使他们可以分别进行演化;而适配器模式用于设计完成之后,当发现完成的类无法协同工作时,可以采用适配器模式

然而,很多情况下载设计初期就要考虑适配器模式的使用,如涉及大量第三方应用接口的情况。




图2 采用桥接模式的扩展


适配器模式与桥接模式的联合这种情况经常出现在需要其他系统提供实现方法时,一个典型的例子是工业控制中的数据采集。不同工控厂家提供的底层数据采集接口通常不同。,因此在做上层软件设计师无法预知可能遇到的任何接口。为此需要定义一个通用的采集接口,然后针对据体的数据采集系统开发相应的适配器。数据存储需要调用数据采集借口获得数据,而火速据可以保存到关系数据库、实施数据库或者文件中。数据存储接口和数据采集结构构成了桥接。


java 桥接模式 适配器模式 适配器模式和桥接模式_适配器模式_02



图3 桥接模式和适配器模式联合


同样的结构也经常出现在报表的相关应用中,报表本身结构和报表输出完全可以分开。


java 桥接模式 适配器模式 适配器模式和桥接模式_外观模式_03



图4 数据采集系统中的桥接模式与适配器模式


如图所以,报表输出可以单独抽象出来与报表的具体形式分开。但报表输出又依赖于具体的输出形式,如果需要输出为PDF格式,则需要调用与PDF相关的API,而这是设计所无法控制的,因此这里要使用适配器模式。


java 桥接模式 适配器模式 适配器模式和桥接模式_适配器模式_04



图5 报表输出系统中的桥接模式与适配器模式


适配器模式与外观模式的关系

适配器模式与外观模式有些相似,都是对现存系统的封装。但这两种模式的意图完全不同。前者使现存系统与正在设计的系统协同工作,而后者则为现存系统提供一个更为方便的访问接口。简单的说,适配器模式为事后设计,而外观模式则必须事前设计。总之,适配器模式没有引入新的接口,而外观模式则定义了一个新的接口。


java 桥接模式 适配器模式 适配器模式和桥接模式_外观模式_05



图6 系统演化过程中的外观模式