在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。–维基百科
适配器模式包含如下角色:
- Target(目标抽象类)
- Adapter(适配器类)
- Adaptee(适配者类)
- Client(客户类)
适配器UML类图如下(图片摘自https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html):
生活中时常会有这样的场景,使用的电脑显示屏接口分为VGA、HDMI,有很多显示屏只支持VGA,若使用时需要连接支持VGA的接口的电脑,有一些显示屏只支持HDMI,若使用时只能连接支持HDMI的电脑,那如果用户买了一台只支持VGA接口的显示屏,而电脑只支持HDMI接口,此时只需要购买VGA、HDMI转换器即可,下面通过代码说明.
VgaScreenInterface(VGA屏幕接口):
public interface VgaScreenInterface {
void vgaSocket();
}
VgaComputer(只支持VGA接口的电脑):
public class VgaComputer implements VgaScreenInterface {
@Override
public void vgaSocket() {
System.out.println("VGA屏幕与VGA电脑已连接");
}
}
HdmiScreenInterface(HDMI屏幕接口):
public interface HdmiScreenInterface {
void hdmiSocket();
}
HdmiComputer(只支持HDMI接口的电脑):
public class HdmiComputer implements HdmiScreenInterface {
@Override
public void hdmiSocket() {
System.out.println("Hdmi屏幕已经与电脑连接");
}
}
此时由于购买的屏幕支持VGA接口,而电脑只支持HMDI接口,只需要通过转换器(适配器)即可:
public class SocketAdapter implements VgaScreenInterface {
// /获取适配者类的引用
HdmiScreenInterface hdmiScreenInterface;
public SocketAdapter(HdmiScreenInterface hdmiScreenInterface) {
this.hdmiScreenInterface = hdmiScreenInterface;
}
@Override
public void vgaSocket() {
hdmiScreenInterface.hdmiSocket();
}
}
User(用户类):
public class User {
VgaScreenInterface vgaScreenInterface;
public User setAdapter(VgaScreenInterface vgaScreenInterface) {
this.vgaScreenInterface = vgaScreenInterface;
return this;
}
public void use(){
vgaScreenInterface.vgaSocket();
}
}
测试:
public class Test {
public static void main(String[] args) {
HdmiScreenInterface hdmiScreenInterface = new HdmiComputer();
VgaScreenInterface vgaScreenInterface = new SocketAdapter(hdmiScreenInterface);
User user = new User();
user.setAdapter(vgaScreenInterface);
user.use();
}
}
以上User为:Client,VgaScreenInterface为:目标抽象类,SocketAdapter为:适配器类,HdmiComputer为:适配者类
适配器具有一下优点:
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码
- 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
- 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”
文章参考