定义
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。简而言之,将一个类的接口转换成客户希望的另外一个接口。
分类
适配器模式有分三类:
1、类适配器模式(class adapter pattern)
2、对象适配器模式(object adapter pattern)
3、缺省适配器模式(default adapter pattern),也叫默认适配器模式、接口适配器模式
角色职责
(1)目标抽象类:Target,该角色把其他类转换为我们期望的接口,可以是一个抽象类或接口,也可以是具体类。
(2)被适配者: Adaptee ,原有的接口,也是希望被适配的接口。
(3)适配器: Adapter, 将被适配者和目标抽象类组合到一起的类。
代码实现
类适配器
目标抽象类:
public interface Target {
public void request();
}
被适配者:
public class Adaptee {
public void specificRequest() {
System.out.println("适配者中的业务代码被调用");
}
}
适配器:
public class ClassAdapter extends Adaptee implements Target {
@Override
public void request() {
super.specificRequest();
}
}
测试结果:
public class ClassAdapterTest {
public static void main(String[] args) {
System.out.println("类适配器模拟测试:");
Target target = new ClassAdapter();
target.request();
}
}
控制台输出结果:
类适配器模拟测试:
适配者中的业务代码被调用
对象适配器
适配器:
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
//业务处理前加强
adaptee.specificRequest();
//业务处理后加强
}
}
测试结果:
public class ObjectAdapterTest {
public static void main(String[] args) {
System.out.println("对象适配器模拟测试:");
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
控制台输出结果:
对象适配器模拟测试:
适配者中的业务代码被调用
缺省适配器模式
目标角色:
public interface SampleOperation {
public abstract void operation1();
public abstract void operation2();
public abstract void operation3();
public abstract void operation4();
public abstract void operation5();
}
适配器角色:
public abstract class DefaultAdapter implements SampleOperation{
@Override
public void operation1() {
}
@Override
public void operation2() {
}
@Override
public void operation3() {
}
@Override
public void operation4() {
}
@Override
public void operation5() {
}
}
测试缺省需要用的类:
public class Operator {
private SampleOperation sampleOperation;
public void addOperation(SampleOperation sampleOperation) {
this.sampleOperation = sampleOperation;
}
public void operation1() {
sampleOperation.operation1();
}
public void operation2() {
sampleOperation.operation2();
}
public void operation3() {
sampleOperation.operation3();
}
public void operation4() {
sampleOperation.operation4();
}
public void operation5() {
sampleOperation.operation5();
}
}
测试结果:
public class DefaultAdapterTest {
public static void main(String[] args) {
// 1、使用缺省适配器只需要实现需要用到的接口方法
Operator operator = new Operator();
operator.addOperation(new DefaultAdapter() {
@Override
public void operation2() {
System.out.println("操作2");
}
});
operator.operation2();
}
}
适用场景
客户端需要一个target(目标)接口,但是不能直接重用已经存在的adaptee(适配者)类,因为它的接口和target接口不一致,所以需要adapter(适配器)将adaptee转换为target接口。
优缺点
优点:
1、复用性:系统需要使用已经存在的类,功能符合系统要求,但这个类的接口不符合系统的需求,通过适配器模式解决不兼容的问题,使这些功能类得到复用。
2、扩展性:适配器使得系统多了一个方式扩展系统的功能
3、耦合性:一定程度上的解耦
缺点:
过多地使用适配器,增加系统理解难度。