一、介绍
我们看一下《研磨设计模式》中的定义:
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的本质是——转换匹配,复用功能。
怎么理解呢?就是说,新的接口需要实现的功能,旧的接口现在都有,问题是,怎么把旧的接口的实现类拿去实现新的接口。
方法很简单,那就是把旧接口的实现类放到适配器中,可以作为成员变量,也可以作为局部变量,只要能使用都可以。然后适配器实现新的接口,在适配器@Overide的方法中,调用旧接口的实现类去实现功能。
二、结构
1、Client——调用者
2、Target——目标接口,需要适配的接口
3、Adapter——适配器,实现目标接口
4、Adaptee——已经存在的接口,能满足需求,但是和目标接口不一致。适配器依赖它,来实现目标接口的功能。
三、我的实现
1、首先我们定义一个接口PastInterface,如下:
package adapter;
public interface PastInterface {
public void past1();
public void past2();
}
2、一个简单是实现类,如下:
package adapter;
public class PastImpl implements PastInterface{
PastImpl(){
System.out.println("我是PastImpl接口的实现");
}
public void past1() {
// TODO Auto-generated method stub
System.out.println("运行Past接口的第一个方法");
}
public void past2() {
// TODO Auto-generated method stub
System.out.println("运行Past接口的第二个方法");
}
}
3、客户端调用时,非常简单:
package adapter;
public class Client {
public static void main(String[] args) {
PastInterface past = new PastImpl();
past.past1();
past.past2();
}
}
4、结果如下:
我是PastImpl接口的实现 运行Past接口的第一个方法 运行Past接口的第二个方法
5、现在需求变更,要用新的接口实现过去的那些功能,新的接口如下:
package adapter;
public interface PresentInterface {
public void present1();
public void present2();
}
6、适配器模式是这样解决问题的。
package adapter;
public class Adapter implements PresentInterface {
PastInterface past = new PastImpl();
public void present1() {
// TODO Auto-generated method stub
past.past1();
}
public void present2() {
// TODO Auto-generated method stub
past.past2();
}
}
如上,Adapter类实现了当前接口PresentInterface,其方法则由原来的接口方法实现,可谓“换汤不换药”,就像一个简单的转换器,把原本的功能包装一下,变成了现在的功能。
7、于是,客户端调用时,如下:
package adapter;
public class Client2 {
public static void main(String[] args) {
//创建一个适配器,由于适配器实现了新接口的功能,所以直接调用适配器的方法。
Adapter adapter = new Adapter();
adapter.present1();
adapter.present2();
}
}
最终结果跟原结果没有任何区别。