设计模式(7) ——- 适配器模式
- 适配器模式是指将一个接口转换成希望的另一个接口,该模式使得原来不兼容的类可以一起工作
概述
适配器模式
适配器模式的作用就是适配,换个词也就是转换作用。这里举个例子。新买的手机自带的耳机是 2.5 接口的,有一天耳机坏了或者丢了,但是在市场上根本就买不到 2.5 接口,基本上都是 3.5 的接口了。没办法,你只好买了个 3.5 接口的耳机。在购买的时候老板推荐你买个适配器。这里适配器的作用就是将 3.5 接口转换为 2.5 接口。这是现实中的一个例子,而在设计模式中适配器模式的作用也是这样的。
适配器模式的角色
- 目标抽象角色
目标抽象角色,定义用户所期待要使用的接口。一般是接口或者是抽象类。
- 目标抽象角色
- 源角色
需要适配的原始类。 - 适配器角色
用来把源接口转换成符号要求的目标接口的设备,就像上述例子中的店老板送给我们的那个“转换器”。
举例说明
两种类型的适配器模式
这里有两种类型的适配器。一种是类的适配器模式,另一种是对象的适配器模式。类的适配器模式用于单一源的适配。而对象的适配器模式可以同时适配好几个源。下面通过两个例子来说明。
案例描述
假如原来有个描述人的类。类中其中这样的两方法:说日文方法和说英语方法,用以表述其对象的两项技能。现在有一个岗位需要同时会说日语、英语和法语。现在我们的任务就是为这个类添加一个方法来表述说法语的这项技能。为了保持原类的不变[有时候改变会影响原来的类的结构],这里利用适配器来实现。
类的适配器模式
package 适配器模式; /** * 目标抽象接口 * @author by kissx on 2017/2/5. */ public interface Job { void speakJapanese(); void speakEnglish(); void speakFrench(); } package 适配器模式; /** * 源角色 * @author by kissx on 2017/2/5. */ public class Person { private String name; private String sex; private int age; public void speakJapanese(){ System.out.println("I can speak Japanese!"); } public void speakEnglish(){ System.out.println("I can speak English!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } package 适配器模式; /** * 类的适配器模式实现 * 适配器角色 * @author by kissx on 2017/2/5. */ public class ClassAdapter extends Person implements Job{ @Override public void speakFrench() { System.out.println("I can speak French!"); } }
说明:上面注释中都说明了各个类的用途,比较容易这里就不再详细说明了。可以看出类的适配器模式只能适配单一源且结构比较清晰。
对象的适配器模式
package 适配器模式; /** * 对象适配器实例实现 * 适配器角色 * @author by kissx on 2017/2/5. */ public class ObjectAdapter implements Job { private Person person; public ObjectAdapter(Person person){ this.person = person; } @Override public void speakJapanese() { person.speakJapanese(); } @Override public void speakEnglish() { person.speakEnglish(); } @Override public void speakFrench() { System.out.println("I can speak French!"); } }
说明:可以看出,对象的适配模式则可以用于多源的适配,弥补了类适配器的不足,使得原本用类适配器模式的情况不复存在。弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
总结
原本以为适配器模式很复杂,主要是对适配器该词没有理解。其实,别人起这个名字是有原因的,多想想未必不是好事。