1.定义
将一个接口转换成客户希望的另一个接口
2.分类
适配器模式主要有两种,类适配器和对象适配器;
3.类适配器
客户需要可以直接调用Target接口,但是客户目标是Adaptee接口,此时可以定义Adapter类继承adaptee的实现类,同时实现Target接口,示例代码如下
//Target: 客户需要直接调用的接口
//Adaptee: 已经存在的接口,包含最终需要调用的方法,需要进行适配
//Adapter: 适配器类,让客户通过Target接口可以调用adaptee中的方法
public class ClassAdapterPattern {
public static void main(String[] args){
Adapter adapter=new Adapter();
adapter.eat();
}
}
interface Target{
void eat();
}
interface Adaptee{
void drink();
}
class AdapteeImpl implements Adaptee{
public void drink(){
System.out.println("drink something");
}
}
class Adapter extends AdapteeImpl implements Target{
public void eat(){
drink();
}
}
4.对象适配器
客户需要可以直接调用Target接口,但是客户目标是Adaptee接口,此时可以定义Adapter实现Target接口,同时其中定义Adaptee对象来实现客户真正需要的功能,示例代码如下
//Target: 客户需要直接调用的接口
//Adaptee: 已经存在的接口,包含最终需要调用的方法,需要进行适配
//Adapter: 适配器类,让客户通过Target接口可以调用adaptee中的方法
public class ObjectAdapterPattern {
public static void main(String[] args){
Adaptee2 adaptee2=new Adaptee2Impl();
Adapter2 adapter2=new Adapter2(adaptee2);
adapter2.eat();
}
}
interface Target2{
void eat();
}
interface Adaptee2{
void drink();
}
class Adaptee2Impl implements Adaptee2{
public void drink(){
System.out.println("drink something!");
}
}
class Adapter2 implements Target{
private Adaptee2 adaptee2;
public Adapter2(Adaptee2 adaptee2){
this.adaptee2=adaptee2;
}
public void eat(){
adaptee2.drink();
}
}
5.优点与缺点
1)使得Target类更易于扩展,如果需要扩展其他功能可以定义其他Adapter类;