适配器(Adapter)模式:将一个类的接口转换为另一个接口,使得原来不兼容的类相互兼容。适配器模式分为:类适配器和对象适配器模式,前者的耦合度比后者要高,并且类适配器通过继承来完成适配,对象适配器则是通过关联来完成。
优点:
- 通过适配器可以更加透明的调用目标接口
- 复用现存的类,而无需修改太多
- 解耦适配者和目标类,解决了二者接口不一致问题
缺点:
- 需要结合系统业务考虑,会增加复杂性
- 降低了代码的可读性,适配器过多反而会使代码变得凌乱
结构:
- 目标对象:用户期待的连接口,适配器类即将要进行适配的抽象类或接口;
- 适配者: 可以是内部的类或服务,也可以是外部对象或服务。
- 适配器:可以是类或接口,是作为具体适配者类的中间类来使用;
类适配器示例:
这一实现使用了继承机制: 适配器同时继承两个对象的接口,但是由于JAVA是单继承语言,所以需要配合接口去做
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
// 目标接口
interface Target{
void request();
}
// 适配者
static class Adaptee {
public void specificRequest(){
System.out.println("适配者");
}
}
// 适配器
static class Adapter extends Adaptee implements Target{
@Override
public void request() {
// 可以在这里进行自定义的一些适配操作
specificRequest();
}
}
对象适配器示例:
实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 下面列举了一个电压适配的案例:我国居民用电为220V,手机充电一般只需要5V,所以需要将220V转换为5V
public class AdapterDemo {
public static void main(String[] args) {
AdapterAC220 ac110 = new AdapterAC220();
String ac = ac110.outputDC5V(new AC220V());
System.out.println(ac); // 5V
System.out.println(ac110.outputDC5V(new AC110V())); //电压异常
}
// 电压输出接口
interface AC{
String output();
}
// 110V电压
static class AC110V implements AC{
@Override
public String output() {
return "110V";
}
}
// 220V电压
static class AC220V implements AC{
@Override
public String output() {
return "220V";
}
}
// 适配器
interface Adapter {
// 比较 电压与适配器是否匹配
boolean support(AC ac);
// 转换电压
String outputDC5V(AC ac);
}
// 110V 适配器
static class AdapterAC110 implements Adapter{
@Override
public boolean support(AC ac) {
return ac.output().equals("110V");
}
@Override
public String outputDC5V(AC ac) {
if (!this.support(ac)){
return "电压异常";
}
return "5V";
}
}
// 220V 适配器
static class AdapterAC220 implements Adapter{
@Override
public boolean support(AC ac) {
return ac.output().equals("220V");
}
@Override
public String outputDC5V(AC ac) {
if (!this.support(ac)){
return "电压异常";
}
return "5V";
}
}
}