适配器模式思想
适配器模式是一种结构型设计模式。
思想:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配就是由源
到目标
的适配,而当中链接两者的关系就是适配器
,它负责把源
过度到目标
。
适配器模式包括3种形式:类适配器模式、对象适配器模式、接口适配器模式
(或又称作缺省适配器模式)。
适配器模式涉及3个角色
用电器来打个比喻: 有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。
- 源(Adaptee):需要被适配的对象或类型,相当于插头。
- 适配器(Adapter):连接目标和源的中间对象,适配器同时继承源和实现目标,相当于插头转换器。
- 目标(Target):期待得到的目标,相当于插座。
类适配器模式
案例: 一个员工(源)会说日语和英语,而某个岗位(目标)需要你同时会说日语、英语、和法语,现在我们的任务就是要将这个员工适配到这个岗位中。最简单的办法是为员工添加一个说法语的方法,就满足目标的需要。
但是上面为了实现某种目的而为一个源类暂时性的加上某种方法,已经破坏原类的结构。同时不这么做也符合Java的高内聚,低耦合的原理。所以可以使用适配器模式。
员工(源):
public class Staff {
public void speakJapanese(){
System.out.println("我会说日语");
}
public void speakEnglish(){
System.out.println("我会说英语");
}
}
岗位(目标):
public interface Post {
void speakJapanese();
void speakEnglish();
void speakFrench();
}
适配器,适配器同时继承源和实现目标:
public class Adapter extends Staff implements Post{
@Override
public void speakFrench() {
System.out.println("我会说法语");
}
}
客户端:
public class App {
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.speakJapanese();
adapter.speakEnglish();
adapter.speakFrench();
}
}
运行结果。
对象适配器模式
对象适配器模式是把源
作为一个对象聚合到适配器类中,然后执行接口所要求的方法。 这种适配模式可以为多个源进行适配。弥补了类适配模式的不足。
修改适配器:
public class Adapter implements Post{
private Staff staff;
public Adapter(Staff staff){
this.staff = staff;
}
@Override
public void speakJapanese() {
staff.speakJapanese();
}
@Override
public void speakEnglish() {
staff.speakEnglish();
}
@Override
public void speakFrench() {
System.out.println("我会说法语");
}
}
接口适配器模式
也是默认适配器模式,这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。
抽象类去空实现目标接口的所有方法:
public abstract class AdapterAbstract implements Post {
@Override
public void speakJapanese() {
}
@Override
public void speakEnglish() {
}
@Override
public void speakFrench() {
}
}
具体的适配器实现类:
public class AdapterImpl extends AdapterAbstract {
@Override
public void speakChinese() {
System.out.println("I can speak Chinese!");
}
}