介绍
**定义:**适配器模式的主要作用是做兼容, 它可以将原本不兼容的接口转换为可兼容的接口, 从而使它们可以一起工作. 适配器模式有两种实现方式: 类适配器(继承关系)和对象适配器(组合关系), 由于类适配器的耦合度较高, 所以开发中通常使用对象适配器.
UML

示例
java
package com.sumlv.demo;
import com.sumlv.demo.decorator.IOSAdapterAndroid1;
import com.sumlv.demo.decorator.IOSAdapterAndroid2;
import com.sumlv.demo.service.impl.AndroidPhoneImpl;
public class Main {
public static void main(String[] args) {
Phone phone = new Phone();
// 类适配器
phone.printSystem(new IOSAdapterAndroid1());
// 对象适配器
phone.printSystem(new IOSAdapterAndroid2(new AndroidPhoneImpl()));
}
}
java
package com.sumlv.demo;
import com.sumlv.demo.service.IOSPhone;
/**
* 手机类(模拟客户端)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public class Phone {
/**
* 打印系统名称(模拟实际业务)
* 由于入参只有苹果手机, 所以无法兼容安卓手机
*/
public void printSystem(IOSPhone phone) {
System.out.println(phone.getSystemName());
}
}
java
package com.sumlv.demo.decorator;
import com.sumlv.demo.service.IOSPhone;
import com.sumlv.demo.service.impl.AndroidPhoneImpl;
/**
* 苹果兼容安卓适配器(类适配器)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public class IOSAdapterAndroid1 extends AndroidPhoneImpl implements IOSPhone {
@Override
public String getSystemName() {
return super.getSystemName();
}
}
java
package com.sumlv.demo.decorator;
import com.sumlv.demo.service.AndroidPhone;
import com.sumlv.demo.service.IOSPhone;
/**
* 苹果兼容安卓适配器(对象适配器)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public class IOSAdapterAndroid2 implements IOSPhone {
private AndroidPhone androidPhone;
public IOSAdapterAndroid2(AndroidPhone androidPhone) {
this.androidPhone = androidPhone;
}
@Override
public String getSystemName() {
return androidPhone.getSystemName();
}
}
java
package com.sumlv.demo.service;
/**
* 苹果手机(目标抽象接口)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public interface IOSPhone {
String getSystemName();
}
java
package com.sumlv.demo.service.impl;
import com.sumlv.demo.service.IOSPhone;
/**
* 苹果手机实现(目标抽象接口实现)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public class IOSPhoneImpl implements IOSPhone {
@Override
public String getSystemName() {
return "IOS";
}
}
java
package com.sumlv.demo.service;
/**
* 安卓手机(适配者接口)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public interface AndroidPhone {
String getSystemName();
}
java
package com.sumlv.demo.service.impl;
import com.sumlv.demo.service.AndroidPhone;
/**
* 安卓手机实现(适配者接口实现)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-10
*/
public class AndroidPhoneImpl implements AndroidPhone {
@Override
public String getSystemName() {
return "Android";
}
}
总结
使用场景
-
当需要设计统一多个类的接口时(如果某个功能需要依赖多个外部类, 就可以通过适配器将他们适配为统一的接口定义);
-
当系统需要替换外部依赖时(使用适配器可以减少代码的改动);
-
当原有接口无法更改又必须兼容时(参照jdk中Iterator兼容Enumeration).
优点:
-
可以在重用现有适配者类的情况下使目标类和适配者类之间解耦, 更无需修改原有结构;
-
提高了透明性(对客户端而言, 兼容逻辑是透明的);
-
提高了复用性(适配者可以在多个系统中复用);
-
提高了灵活性(可以通过配置文件更换适配器);
-
提高了拓展性(新增适配器无需修改原代码, 符合开闭原则).
缺点:
-
由于java不能多继承, 所以一次最多适配一个类(类适配器);
-
无法为最终类做适配(类适配器);
-
当需要置换适配者类中的某些方法时比较麻烦(对象适配器).