第七式 适配器模式
适配器模式
生活中的适配器
生活中适配器到处可见,我们大家使用的笔记本电脑的适配器,可以让我们在全世界使用,即使日本的交流电是110V而我国是220V。还有就是插头插座转换的适配器,当你的电器插头是3脚,而你家只有2孔插座,可以买一个3脚转2脚的适配器。
面向对象适配器
假设有一个软件系统,你希望它能和一个新的厂商搭配使用,但是这个心厂商所涉及出来的接口,不同于旧厂商的接口:
你不想改变现在有的代码,解决这个问题(而且也不想改变厂商的代码)。解决这个问题,可以写一个类,将厂商的接口转变成所期望的接口。
这个适配器工作起来就如同一个中间人,它将客户所发出的请求转换成厂商类能理解的请求。
什么是适配器模式
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。
类图:
这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被设配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。
代码
现在NBA季后赛激战正酣,昨天火箭被勇士淘汰。以后姚明在火箭的时候就关注上火箭了。为什么说这个呢,姚明是我们的骄傲,他02年以状元秀进入NBA时,是不会英文的,虽然之后他的英文666,,但当时他怎么跟教练队友交流呢?答案是球队给他配备了一个翻译,那个翻译就是适配器,这种解决方案就是适配器模式。我们用代码模拟一下这个过程
/** * NBA球员接口 */ public interface Player { public void talk(); }
public class Kobe implements Player { public void talk() { System.out.println("I say English"); } }
public class Yao { public void say(){ System.out.println("我说中文"); } }
/** * 姚明的翻译者 */ public class Translator implements Player { private Yao yao; public Translator(Yao yao){ this.yao=yao; } public void talk() { yao.say(); System.out.println("translate to english"); } }
/** * 客户端调用,模拟跟教练交流;科比可以说英文可以跟教练自由沟通 * 姚明需要通过翻译 */ public static void main(String[] args){ Kobe kobe = new Kobe(); Yao yao = new Yao(); Translator translator = new Translator(yao); kobe.talk(); translator.talk(); }