目录

[TOC]

什么是适配器模式

适配器模式是一种结构型设计模式。它的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

在适配器模式中,我们通过增加一个新的适配器类来解决接口兼容问题。这个新的适配器类会持有一个或多个目标对象,并且将这些目标对象转换成客户端所期望的另一种接口。

应用场景

  • 当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时
  • 当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时

UML类图

适配器模式只有3个角色

  • Target

是一个接口,它是我们客户端使用的目标接口

  • Adaptee

我们想要使用的接口与Target不兼容的类,它可以是一个接口,也可以是一个类。

  • Adapter

适配器类,此模式的核心。它需要实现目标接口Target,而且必须要引用Adaptee,因为我们要在此类中包装Adaptee的功能

image-20230623161718401

代码

img

目标接口

系统原来的日志接口如下

1
2
3
4
5
6
/**
* 系统原来的日志接口
*/
public interface LogFactory {
void debug(String tag,String message);
}

三方库接口及实现

下面是第三方库提供的日志功能,但是其接口与原系统目前使用的不兼容。

1
2
3
4
5
6
/**
* 新的日志系统接口
*/
public interface NewLogger {
void newDebug(int priority, String message, Object... obj);
}
1
2
3
4
5
6
7
8
9
/**
* 新的日志系统接口实现
*/
public class NewLoggerImp implements NewLogger {
@Override
public void newDebug(int priority, String message, Object... obj) {
System.out.println(String.format("新的日志系统:logger记录:%s", message));
}
}

构建适配器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Objects;

/**
* 适配器
*/
public class LogAdapter implements LogFactory {
private NewLogger nbLogger;

public LogAdapter(NewLogger nbLogger) {
this.nbLogger = nbLogger;
}

/**
* 实现老的日志接口,实现老日志接口中的方法,在该方法中使用新的日志系统进行日志打印
*/
@Override
public void debug(String tag, String message) {
Objects.requireNonNull(nbLogger);
nbLogger.newDebug(1, message);
}
}

测试

1
2
3
4
5
6
7
public class AdapterClient {
public static void main(String[] args) {
//使用老的日志接口,但是new是适配器,并且将新的适配器类传入进去,然后调用的日志打印的方法就是信息日志系统进行打印
LogFactory logFactory = new LogAdapter(new NewLoggerImp());
logFactory.debug("Test", "我将使用牛逼logger打印log");
}
}

image-20230623163404690

总结

优点:

  1. 提高代码复用性:适配器模式通过将一个类的接口转换成客户端所期望的接口,可以让原本不兼容的类能够协同工作,从而提高代码的复用性。
  2. 提高系统灵活性:适配器模式可以将不同的类的接口统一起来,从而使得系统更加灵活,能够适应各种变化。
  3. 符合开闭原则:适配器模式可以在不修改现有代码的情况下添加新功能,从而符合开闭原则。

缺点:

  1. 增加代码复杂度:适配器模式需要增加一个适配器类来实现接口转换,这会增加代码的复杂度。
  2. 降低代码可读性:适配器模式可能会让代码的逻辑变得更加复杂,降低代码的可读性和可维护性。
  3. 可能会影响系统性能:适配器模式需要进行额外的类型转换和接口转换,这可能会影响系统的性能。

总之,适配器模式是一种非常有用的设计模式,它可以帮助我们将现有的代码与其他代码或系统集成起来,从而提高软件系统的灵活性和可维护性。但是,在使用适配器模式时,需要权衡其优缺点并进行适当的设计和实现。