适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间能够协同工作。适配器充当两个不兼容接口之间的桥梁。
// 目标接口
public interface Target {
void request();
}
// 需要适配的类
public class Adaptee {
public void specificRequest() {
System.out.println("特殊请求");
}
}
// 适配器(通过继承)
public class ClassAdapter extends Adaptee implements Target {
public void request() {
specificRequest(); // 调用父类方法
}
}
// 目标接口(同上)
public interface Target {
void request();
}
// 需要适配的类(同上)
public class Adaptee {
public void specificRequest() {
System.out.println("特殊请求");
}
}
// 适配器(通过组合)
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
// 旧系统接口
public interface LegacyUserService {
User getLegacyUser(int id);
}
// 新系统接口
public interface ModernUserService {
UserDTO getUser(String userId);
}
// 适配器实现
public class UserServiceAdapter implements ModernUserService {
private LegacyUserService legacyService;
public UserServiceAdapter(LegacyUserService service) {
this.legacyService = service;
}
public UserDTO getUser(String userId) {
// 转换逻辑
User legacyUser = legacyService.getLegacyUser(Integer.parseInt(userId));
return convertToDTO(legacyUser);
}
private UserDTO convertToDTO(User user) {
// 转换实现
}
}
// 我们的应用接口
public interface Logger {
void log(String message, Level level);
}
// 第三方日志库
public class ThirdPartyLogger {
public void log(String message, int severity) {
// 第三方实现
}
}
// 适配器
public class LoggerAdapter implements Logger {
private ThirdPartyLogger thirdPartyLogger;
public LoggerAdapter(ThirdPartyLogger logger) {
this.thirdPartyLogger = logger;
}
public void log(String message, Level level) {
int severity = convertLevelToSeverity(level);
thirdPartyLogger.log(message, severity);
}
private int convertLevelToSeverity(Level level) {
// 转换逻辑
}
}
// 标准设备接口
public interface Device {
void connect();
void sendData(byte[] data);
}
// 特定厂商实现
public class VendorDevice {
public void vendorConnect() { /*...*/ }
public void transmit(byte[] data) { /*...*/ }
}
// 适配器
public class DeviceAdapter implements Device {
private VendorDevice vendorDevice;
public DeviceAdapter(VendorDevice device) {
this.vendorDevice = device;
}
public void connect() {
vendorDevice.vendorConnect();
}
public void sendData(byte[] data) {
vendorDevice.transmit(data);
}
}
public class BidirectionalAdapter implements Target, AdapteeInterface {
private Target target;
private AdapteeInterface adaptee;
public BidirectionalAdapter(Target target, AdapteeInterface adaptee) {
this.target = target;
this.adaptee = adaptee;
}
// 实现Target接口方法
public void request() {
adaptee.specificRequest();
}
// 实现AdapteeInterface接口方法
public void specificRequest() {
target.request();
}
}
// 大型接口
public interface Service {
void operation1();
void operation2();
void operation3();
}
// 缺省适配器
public abstract class ServiceAdapter implements Service {
public void operation1() {}
public void operation2() {}
public void operation3() {}
}
// 具体实现只需覆盖需要的方法
public class ConcreteService extends ServiceAdapter {
public void operation1() {
// 具体实现
}
}
适配器模式是解决接口不兼容问题的有效方案,特别适用于:
在实际开发中,适配器模式常见于:
正确使用适配器模式可以提高代码的复用性和系统的灵活性,但需要注意不要滥用,以免增加系统复杂性。