解释:
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
解决问题:
需要的东西有,但不能用,且短时间无法改造。即,使得一个功能适合不同的环境。
在开发中,系统的数据、行为都匹配,但接口不符时,可以考虑适配器。
希望复用一些现存的类,但是接口又与复用环境的要求不一致,应该考虑用适配器模式。(使用一个已经存在的类,但它的接口(即,方法),与需要的不相同时)
目的:
使控制范围外的一个原有对象与某接口匹配。
不改变功能、环境的前提下,使用适配器解决他们之间的代沟。
分类:
类适配器模式:通过多重继承对一个接口与另一个接口进行匹配。但很多语言不支持,(一个类只可以继承一个父类),所以使用环境有限,效果也有限。
对象适配器模式;
结构图:
Target,可以是具体、抽象的类、接口
优点:
两个类所做的事情相同、相似。但是具有不同的接口时要使用,且类共享同一接口。这样客户就可以统一调用统一接口就心里。更简单、直接、紧凑。
使用环境:
在软件开发后期、维护期考虑使用。
在双方都不太容易修改的时候再使用适配器模式适配。而不是已有不同时就使用它。
设计系统时,考虑使用第三方开发组件。组件的接口与我们自己的接口是不相同的。
.NET中的类库DataAdapter是一个已经实现的、非常重要的适配器。DataAdapter用作DataSet和数据源之间的适配器,以便检索和保存数据。DataAdapter通过映射Fill(更改了DataSet中的数据以便与数据源中的数据相匹配)、Update(更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一适配器。例如,数据源来源不同(SQL Server、Oracle……),其数据组织不同,但可以通过DataAdapter得到统一的DataSet数据。不必关注数据库的数据细节,就可以灵活使用数据。
示例:
使用注意:
适配器模式是好模式,单不能无视应用场合而盲目使用,导致本末倒置。
如果能事前预防接口不同的问题,不匹配就不会发生;有效接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计、代码的情况时,才考虑适配。
事后控制不如事中控制,事中控制不如事前控制。
扩展:
软件开发初期。公司内部,类、方法的命名应该规范,最好前期就设计好。如果出现类似的功能类不同程序员定义方法的名称不同时。应该考虑通过重构统一接口,而不应该使用适配器。