又叫做包装器(Wrapper),属于结构性模式,将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。、
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
目标抽象类(Target):定义用户需要的相关接口
适配者(Adaptee):要被适配的角色,定义类一系列的接口,实现用户需要的一些业务功能
适配器(Adapter):将Adaptee适配到Target上,适配器通常继承抽象目标类,并通过组合适配者,从而使得目标类与适配者之间形成关联
类适配器,指的是适配器Adapter继承我们的被适配者Adaptee,并实现目标接口Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee
例子,如果鸭子走起路像鸭子,叫起来像一只鸭子,那么它可能是一只包装了鸭子类适配器的火鸡
1.目标抽象类
public interface Duck {
void quack();
void fly();
}
2.适配者
被适配的类
public interface Turkey {
void gobble();
void fly();
}
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("gobble gobble");
}
@Override
public void fly() {
System.out.println("fly fly");
}
}
3.适配器
/**
* 适配器类,实现了Duck接口,目的将火鸡换成鸭子,以假乱真
*/
public class DuckAdapter extends WildTurkey implements Duck {
@Override
public void quack() {
super.gobble();
}
@Override
public void fly() {
// 由于火鸡的飞行距离较鸭子近,为了伪装成鸭子,让它飞三次来对应鸭子的飞行
for (int i = 0; i < 3; i++) {
super.fly();
}
}
}
4.使用
@Test
public void testClassAdapter() {
DuckAdapter duckAdapter = new DuckAdapter();
duckAdapter.quack();
duckAdapter.fly();
}
对象适配器,就是适配器实现我们的目标接口,但是并不继承需要被适配的类。而是通过在适配器的构造函数中将需要被适配的类传递进来从而进行适配
对象适配器,与类适配器不同的是:对象适配器可以适配多个源到目标
/**
* 适配器类,实现了Duck接口,目的将火鸡换成鸭子,以假乱真
*/
public class DuckAdapter implements Duck {
private Turkey turkey;
/**
* 通过构造方法,获得适配对象实例化的引用
*/
public DuckAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
// 由于火鸡的飞行距离较鸭子近,为了伪装成鸭子,让它飞三次来对应鸭子的飞行
for (int i = 0; i < 3; i++) {
turkey.fly();
}
}
}
使用
@Test
public void testObjectAdapter() {
WildTurkey wildTurkey = new WildTurkey();
// 将火鸡包装进一个火鸡适配器中,使它看起来像一只鸭子
DuckAdapter duckAdapter = new DuckAdapter(wildTurkey);
duckAdapter.quack();
duckAdapter.fly();
}
接口适配器模式,又叫适配器模式或缺省适配器模式,通过抽象类来实现适配
存在这样一个接口,定义了N种方法,我们只想使用其中的一个或几个方法,如果直接实现接口,那么要对所有的方法进行实现,会导致这个类变得臃肿,调用也不方便,这时可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么在创建抽象类的继承类,重写需要使用的那几个方法即可
public abstract class DuckAdapter implements Duck {
@Override
public void quack() { }
@Override
public void fly() { }
}