大话设计模式十五之适配器模式

姚明说在CBA和NBA最大的区别是,在NBA需要翻译,在CBA不需要。在NBA之前专门为他配备了翻译,那个翻译一直在姚明身边,特别是比赛场上,教练、队员与他的对话全部都通过翻译来沟通。


一、适配器模式

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能以前工作的那些类可以一起工作。



适配器模式注意解决什么问题呢?

简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。


姚明不会英语,但是要到NBA打球

第一种办法,让姚明学会英语,马上学到可以听懂会说的地步是很困难的,不现实。第二,让教练和球员学会中文,更是在搞笑。那只能给姚明找个翻译。

在不能更改球队的教练、球员和姚明的前提下,我们能做的就是想办法找个适配器。


系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。


在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式,由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、VB.NET、JAVA等语言都不支持多重继承(C++支持),也就是一个类只有一个父类,所以我们这里主要讲的是对象适配器。





二、何时使用适配器模式

使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。


两个类所做的事情相同或类似,但是具有不同的接口时要使用它。


客户代码可以统一调用同一接口就行了,这样可以更简单、更直接、更紧凑


其实用适配器模式也是无奈之举,很有点‘亡羊补牢’的感觉,是软件就有维护的一天,维护就有可能会因不同的开放人员、不同的产品、不同的厂家而造成功能类似而接口不同的情况,此时就是适配器模式大展拳脚的时候了。

是在软件开发后期或维护期再考虑使用它,如果是在设计阶段,需要把类似的功能的类设计成相同的接口。

在公司内部,类和方法的明没应该有规范,最好前期就设计好,如果接口不相同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口。


在双方都不太容易修改的时候再使用适配器模式适配。


也有在设计之初就需要考虑用适配器模式的时候。比如公司设计以系统时考虑使用第三方开发组件,而这个组件的接口与我们自己的系统接口是不相同的,而我们也完全没有必要为了迎合它而改动自己的接口,此时尽管是在开发的设计阶段,也是可以考虑用适配器模式来解决接口不同的问题。


下面是火箭队的比赛,教练叫暂停时给后卫、中锋、前锋分配进攻和防守任务的代码

后卫、中锋、前锋都是球员,所以应该有一个球员抽象类,有进攻和防守的方法。











三、适配器模式的.NET应用

在.NET中有一个类库已经实现的、非常重要的适配器,那就是DataAdapter, DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据园中的数据以便与DataSet中的数据相匹配)类提供这一适配器。


如果能事先预防接口不同的问题,不匹配的问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配,事后控制不如事中控制,事中控制不如事前控制。

猜你喜欢

转载自blog.csdn.net/nicolelili1/article/details/80109428