适配模式与桥接模式的区别和联系
两种模式的区别在于使用场合不同,适配器模式主要解决两个已有接口间的匹配问题。这种情况下被适配的接口的实现往往是一个黑匣子。我们不想,也不能改变这个接口及其实现。同时也不能控制其演化,只要相关的对象能与系统定义的接口协同工作即可。适配器模式经常用在与第三方产品的功能集成上,采用该模式适应新类型的增加的方式是开发针对这个类的适配器。
图1 采用适配器模式的扩展
桥接模式则不同,参与桥接的接口是稳定的,用户可以扩展和修改桥接种的类,但是不能改变接口。桥接模式通过接口继承或者类继承实现功能的扩展。
按照GOF的说法,桥接模式和适配器模式用于设计的不同阶段,桥接模式用于设计的前期,即在设计类的时候将雷规划为逻辑和实现两大类,使他们可以分别进行演化;而适配器模式用于设计完成之后,当发现完成的类无法协同工作时,可以采用适配器模式
然而,很多情况下载设计初期就要考虑适配器模式的使用,如涉及大量第三方应用接口的情况。
图2 采用桥接模式的扩展
适配器模式与桥接模式的联合
这种情况经常出现在需要其他系统提供实现方法时,一个典型的例子是工业控制中的数据采集。不同工控厂家提供的底层数据采集接口通常不同。,因此在做上层软件设计师无法预知可能遇到的任何接口。为此需要定义一个通用的采集接口,然后针对据体的数据采集系统开发相应的适配器。数据存储需要调用数据采集借口获得数据,而火速据可以保存到关系数据库、实施数据库或者文件中。数据存储接口和数据采集结构构成了桥接。
图3 桥接模式和适配器模式联合
同样的结构也经常出现在报表的相关应用中,报表本身结构和报表输出完全可以分开。
图4 数据采集系统中的桥接模式与适配器模式
如图所以,报表输出可以单独抽象出来与报表的具体形式分开。但报表输出又依赖于具体的输出形式,如果需要输出为PDF格式,则需要调用与PDF相关的API,而这是设计所无法控制的,因此这里要使用适配器模式。
图5 报表输出系统中的桥接模式与适配器模式
适配器模式与外观模式的关系
适配器模式与外观模式有些相似,都是对现存系统的封装。但这两种模式的意图完全不同。前者使现存系统与正在设计的系统协同工作,而后者则为现存系统提供一个更为方便的访问接口。简单的说,适配器模式为事后设计,而外观模式则必须事前设计。总之,适配器模式没有引入新的接口,而外观模式则定义了一个新的接口。
图6 系统演化过程中的外观模式