结构型模式
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 组合模式(Composite Pattern)
- 装饰器模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个类的接口转换成客户端所期望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式的目的是将接口不兼容的类连接起来,使得它们能够正常工作。
关键概念
- 目标接口(Target):客户端希望使用的接口,是适配器模式的目标。
- 适配者接口(Adaptee):需要适配的现有接口,客户端无法直接使用的接口。
- 适配器(Adapter):实现目标接口,并且持有一个适配者对象,通过适配器将适配者的接口转换为目标接口,使得客户端可以正常调用。
类图
适配器模式的类图通常会包含三个主要角色:
- Client(客户端):使用目标接口与适配器交互。
- Target(目标接口):客户端所期望的接口。
- Adapter(适配器):适配器类,负责将适配者的接口转换为目标接口。
- Adaptee(适配者):被适配的类,客户端原本不能直接使用的接口。
适配器模式(Adapter Pattern)是一种结构型设计模式,它通过将一个类的接口转换成客户端所期望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式的目的是将接口不兼容的类连接起来,使得它们能够正常工作。
关键概念
- 目标接口(Target):客户端希望使用的接口,是适配器模式的目标。
- 适配者接口(Adaptee):需要适配的现有接口,客户端无法直接使用的接口。
- 适配器(Adapter):实现目标接口,并且持有一个适配者对象,通过适配器将适配者的接口转换为目标接口,使得客户端可以正常调用。
类图
适配器模式的类图通常会包含三个主要角色:
- Client(客户端):使用目标接口与适配器交互。
- Target(目标接口):客户端所期望的接口。
- Adapter(适配器):适配器类,负责将适配者的接口转换为目标接口。
- Adaptee(适配者):被适配的类,客户端原本不能直接使用的接口。
举个例子:电源适配器
假设我们有两个设备,一个是国内电压的设备(220V),另一个是国外电压的设备(110V)。为了让这两个设备都能使用同一个插座,我们需要一个电源适配器来转换电压。
// 目标接口,表示标准的电源接口,期望输出 220V
interface PowerOutlet {
int providePower();
}
// 被适配者,一个提供 110V 电压的电源类
class USPowerSource {
public int provide110V() {
return 110;
}
}
// 适配器类,将 110V 电源适配到 220V 电源接口
class PowerAdapter implements PowerOutlet {
private USPowerSource usPowerSource;
public PowerAdapter(USPowerSource usPowerSource) {
this.usPowerSource = usPowerSource;
}
@Override
public int providePower() {
// 从 110V 电源获取电压,并将其转换为 220V
int voltage = usPowerSource.provide110V();
// 这里进行电压转换,简单示例为乘以 2 得到近似 220V
return voltage * 2;
}
}
// 客户端类,使用标准电源接口
class Client {
public static void main(String[] args) {
USPowerSource usPowerSource = new USPowerSource();
// 创建适配器,并将 110V 电源源作为参数传递给适配器
PowerAdapter powerAdapter = new PowerAdapter(usPowerSource);
// 通过适配器获取 220V 电源
int voltage = powerAdapter.providePower();
System.out.println("The provided voltage is: " + voltage + "V");
}
}
适配器模式的应用场景
适配器模式的应用场景主要有以下几种:
-
现有类库的复用:当需要将一个已有类库与一个新的系统或接口进行集成时,如果它们的接口不兼容,可以使用适配器模式来适配现有的类库接口,使其符合新的系统接口。
-
第三方库的适配:当使用第三方库时,可能会遇到接口不符合当前应用程序的需求,适配器模式可以帮助解决接口不兼容的问题,使得第三方库能够在当前应用中正常工作。
-
需要兼容多个接口:当一个类需要适配多个不同的接口时,可以使用适配器模式创建多个适配器,确保类能够与不同接口的组件进行交互。
优点
- 解耦:客户端与适配者解耦,客户端只需与目标接口交互,而不需要知道适配者的具体实现。
- 重用现有代码:通过适配器模式,可以将已经存在的类与新的系统或需求进行兼容,避免重新实现已有功能。
- 灵活性:能够将不兼容的接口通过适配器连接起来,使得系统的扩展更加灵活。
缺点
- 增加代码复杂性:引入适配器会使代码增加层次,可能使得代码变得更加复杂。
- 性能开销:在某些情况下,适配器模式可能会带来一定的性能开销,尤其是涉及到多层适配时。
总结
适配器模式是非常实用的设计模式,尤其在需要处理接口不兼容的情况时。它能够有效地解耦系统中的不同部分,使得系统更加灵活且易于扩展。适配器模式尤其适用于需要兼容多个接口或将现有类库与新系统进行集成的场景。