小谈设计模式(18)—适配器模式
- 专栏介绍
- 专栏地址
- 专栏介绍
- 适配器模式
- 角色分析
- 目标接口(Target)
- 源接口(Adaptee)
- 适配器(Adapter)
- 核心思想
- 应用场景
- Java程序实现
- 输出结果
- 程序分析
- 1
- 2
- 3
- 优缺点分析
- 优点
- 1
- 2
- 3
- 缺点
- 1
- 2
- 总结
专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
适配器模式
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
角色分析
目标接口(Target)
客户端期望的接口,适配器将原始接口转换成目标接口。
源接口(Adaptee)
需要被适配的类或接口。
适配器(Adapter)
实现目标接口,同时持有源接口的实例,将目标接口的方法调用转发给源接口的实例。
核心思想
通过适配器将目标接口的方法调用转发给源接口的实例。这样一来,客户端就可以通过目标接口来使用源接口的功能。
应用场景
当需要使用一个已经存在的类,但其接口不符合需求时,可以使用适配器模式。例如,使用第三方库提供的接口,但需要将其转换成自己系统中的接口。
当需要复用一些已经存在的类,但是接口与系统的其他部分不兼容时,可以使用适配器模式。例如,将不同数据库的操作接口统一成一个接口。
Java程序实现
// 目标接口
interface Target {
void request();
}
// 源接口
class Adaptee {
void specificRequest() {
System.out.println("Adaptee: specificRequest");
}
}
// 适配器
class Adapter implements Target {
private Adaptee adaptee;
Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
输出结果
Adaptee: specificRequest
这说明适配器模式成功地将不兼容的接口转换成了兼容的接口,使得客户端可以使用目标接口来调用源接口的功能。
程序分析
1
在上面的示例中,我们有一个目标接口Target,其中定义了客户端所期望的方法request。我们还有一个源接口Adaptee,其中有一个不兼容的方法specificRequest。
2
为了使得客户端可以使用Target接口来调用specificRequest方法,我们创建了一个适配器Adapter,实现了Target接口,并持有一个Adaptee的实例。在适配器的request方法中,我们将Target接口的方法调用转发给Adaptee的specificRequest方法。
3
在客户端代码中,我们创建了一个Adaptee实例和一个适配器Adapter实例,并将Adaptee实例传递给适配器的构造函数。然后,我们使用Target接口来调用request方法,实际上是调用了Adaptee的specificRequest方法。
优缺点分析
优点
1
适配器模式可以让不兼容的接口协同工作。
2
适配器模式可以复用已有的类,而无需修改其源代码。
3
适配器模式可以将不同接口的类组合在一起工作。
缺点
1
适配器模式增加了系统的复杂性,因为需要增加一个适配器类。
2
适配器模式可能会降低系统的性能,因为需要进行额外的转换操作。
总结
适配器模式可以将不兼容的接口转换成兼容的接口,使得原本无法一起工作的类可以协同工作。它是一种非常常用的设计模式,可以提高系统的灵活性和可扩展性。