你需要在欧洲使用美国制造的笔记本,但是插口和电压的不一致使得你需要一个叫做适配器的东西,如图:
通过适配器,我们就可以将本来不可以协调合作的两种事物联系在一起了。
那面向对象的适配器又是什么呢?其实,OO适配器和真实世界的适配器扮演着相同的角色:将一个接口转换为另一个接口,以符合用户的期望。
可以简单地用下图理解适配器:
现在我们来一个有趣的例子开始进入代码讲解:
首先鸭子的接口是这样的:
绿头鸭的类:
而火鸡的接口是这样的的:
有这样一种火鸡:
有一只火鸡想冒充鸭子,但是它不会quack,只会gobble,咋办呢?
写个适配器类吧,正如将美国插头冒充为欧洲的那样~~
适配器要实现Duck接口,就像插头适配器本身也是一个插头,重点在于,在调用本来属于鸭子的方法的时候实质上调用了火鸡的方法!
客户端测试一下:
testDuck方法只认鸭子,但是它没想到一只冒充鸭子的火鸡混入其中,也装模作样地像鸭子一样叫和飞。
让我们结合两个例子来解析适配器模式。testDuck方法类似欧洲的插座,它只认欧洲的插头,适配器当然就是我们的火鸡鸭子适配器类了,美国插头就像火鸡,通过适配器,将美国插头伪装成欧洲插头。
看看官方的定义:
适配器模式将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间。
看看类图:
客户只看到目标接口,正如testDuck方法只看到Duck,而欧洲插座只看到欧洲的插头一样,适配器就是把被适配者转换为目标接口的模样。
适配器模式充满着良好的OO设计原则:使用对象组合,已修改的接口包装被适配者。另外的优点是被适配者的子类,都可以搭配适配器使用。
适配器模式在实践中的使用场合:想使用一个已存在的类,但是如果它的方法和你的要求不同时,而你又不想更改客户端的代码时,可以考虑使用适配器。比如:公司在设计一个系统考虑使用第三方开发组件,而这个组件的接口和我们自己的系统接口不同,而我们也没必要为了迎合它而改变自己的接口,就可以考虑使用适配器模式来解决问题。