适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式通常用于使得原本不兼容的接口能够协同工作。适配器模式包含三个主要角色:目标接口(Target Interface)、适配器(Adapter)和被适配者(Adaptee)。
以下是适配器模式的三个主要角色及其作用:
- 目标接口(Target Interface): 这是客户端期望的接口,也是客户端代码调用的接口。适配器模式的目标是使得客户端能够通过目标接口调用适配器的方法。
- 适配器(Adapter): 适配器是一个实现了目标接口的类,它持有一个或多个被适配者的实例,并将客户端的请求转发给被适配者。适配器负责将被适配者的接口转换成目标接口。
- 被适配者(Adaptee): 被适配者是已经存在的类,它包含了客户端代码需要调用的方法,但是其接口与目标接口不兼容。
适配器模式的使用场景包括:
- 当你想使用一个已经存在的类,但它的接口不符合你的需求时,你可以使用适配器模式来将这个类的接口转换成你需要的接口。
- 当你想复用一些现存的类,但是与其他类的协作接口不一致时,你可以使用适配器模式来协调它们之间的关系。
- 当你想通过某个接口与多个类交互,但是这些类的接口不一致时,你可以使用适配器模式统一接口。
以下是一个简单的适配器模式示例,假设有一个Voltage接口表示电压,但是现有的AmericanSocket类的接口与Voltage接口不兼容,我们需要使用适配器将它们协调起来:
package AdapterPattern;
public class Test {
public static void main(String[] args) {
// 客户端代码
AmericanSocket americanSocket = new AmericanSocket();
SocketAdapter adapter = new SocketAdapter(americanSocket);
int voltage = adapter.getVoltage();
System.out.println("Voltage: " + voltage + "V");
}
}
// 目标接口
interface Voltage{
public abstract int getVoltage();
}
// 被适配者
class AmericanSocket{
public int getAmericanVoltage(){
return 110;
}
}
// 适配器类
class SocketAdapter implements Voltage{
private AmericanSocket americanSocket;
public SocketAdapter(AmericanSocket americanSocket) {
this.americanSocket = americanSocket;
}
@Override
public int getVoltage() {
int americanVoltage = americanSocket.getAmericanVoltage();
int voltage = 2 * americanVoltage;
return voltage;
}
}
在这个例子中,Voltage是目标接口,AmericanSocket是被适配者,SocketAdapter是适配器。适配器将AmericanSocket的getAmericanVoltage()方法转换为Voltage接口的getVoltage()方法,使得客户端代码可以通过Voltage接口调用AmericanSocket的方法。
也就是说,我现在有一个接口,还有一个类跟这个接口无法直接实现,就需要一个中间类,这个中间类adapter要实现这个接口,并重写接口中的方法;此外这个中间类需要把想实现接口的类作为内部对象,这样就可以在重写的方法中将之前的类和接口联系起来。
当然也可以继承,继承转为内部对象也是一种常用方法。