一、定义
共有两类适配器模式
对象适配器模式
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的方法。
类适配器模式
这种适配器模式下,适配器继承自已实现的类。
二、解释
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four
基本概念
客户:需要调用我们的代码的对象。
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
主要内容
(1)类适配器
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
(2)对象适配器
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:
(3) 缺省适配器模式
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。
三、代码示例 (出自Java设计模式之《适配器模式》及应用场景)
接口定义
USB.java
public interface USB {
void isUsb();
}
PS2.java
public interface PS2 {
void isPS2();
}
目标类
public class Usber implements USB {
@Override
public void isUsb() {
System.out.println("USB接口");
}
}
1、类适配器
通过继承实现适配功能
Adapter1.java
public class Adapter1 extends Usber implements PS2 {
@Override
public void isPS2() {
isUsb();
}
}
测试类 Test.java
public class Test {
public static void main(String[] args) {
PS2 ps2 = new Adapter1();
System.out.print("PS2接口适配完成,输出:");
ps2.isPS2();
}
}
输出结果
PS2接口适配完成,输出:USB接口
2、对象适配器
通过组合实现适配功能
Adapter2.java
public class Adapter2 implements PS2{
private USB usb;
public Adapter2(USB usb) {
this.usb = usb;
}
@Override
public void isPS2() {
usb.isUsb();
}
}
测试类 Test.java
public class Test {
public static void main(String[] args) {
PS2 ps2_1 = new Adapter2(new Usber());
System.out.print("PS2接口适配完成,输出:");
ps2_1.isPS2();
}
}
输出结果
PS2接口适配完成,输出:USB接口
3、缺省适配器
使用场景
1.接口中规定了所有要实现的方法
2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
假设我们有一个接口Funcs,其中定义N多方法
public interface Funcs {
void a();
void b();
void c();
void d();
void e();
void f();
}
但实现类只需要实现部分方法(假设需要a()、f()方法)即可,此时我们可以定义一个中间类,实现接口Funcs
public abstract class Adapter3 implements Funcs {
@Override
public void a() {
}
@Override
public void b() {
}
@Override
public void c() {
}
@Override
public void d() {
}
@Override
public void e() {
}
@Override
public void f() {
}
}
实现类只需继承此Adapter3类,选择需要的方法实现即可。
public class MyClass extends Adapter3 {
@Override
public void a() {
super.a();
//具体实现
}
@Override
public void f() {
super.f();
//具体实现
}
}
测试类
public class Test {
public static void main(String[] args) {
Funcs funcs = new MyClass();
funcs.a();
funcs.f();
}
}