❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
一、适配器模式的定义
适配器模式(Adapter Pattern)是一种结构型设计模式,将一个类的接口转换成客户希望的另外一个接口,它允许接口不兼容的类之间进行合作,通过引入一个适配器类来使得原本 不兼容的接口能够协同工作,而不需要修改已有的代码。
适配器模式根据实现方式的不同,可以分为 类适配器模式 和 对象适配器模式 ,类适配器模式对于需要重写被适配者的一些方法时比较方便,而对象适配器模式则更加灵活,允许适配器与多个被适配者进行组合。通常更推荐使用对象适配器模式。
二、适配器模式的结构
适配器模式包含以下的重要角色:
- 目标接口(Target): 定义了当前系统业务中客户期望的接口,通常是一个抽象类或接口,其中包含客户端调用的方法。
- 被适配者(Adaptee): 包含了需要被适配的接口,即客户端已有的代码,其具体方法可能与目标接口不兼容。
- 适配器(Adapter): 这是一个转换器,定义了目标接口,并持有被适配者的实例。通过调用适配者的方法,将适配者接口转换成目标接口。
三、适配器模式 —— 类适配器模式的实现
需求案例:中国的手机使用中式充电器即可完成充电,但是如果去到欧洲地区的话由于两地使用的插座类型不同,因此需要一个充电器转换器才能让中式插座在英式插座上使用。
使用类适配器模式完成上述案例,类图如下:
具体的类设计如下:
目标接口(英式插座接口):
public interface BritishSocket {
void supplyPowerInBritish();
}
目标接口(英式插座实现类):
public class BritishSocketImpl implements BritishSocket {
@Override
public void supplyPowerInBritish() {
System.out.println("使用英式插座充电成功");
}
}
被适配者(中式插座接口):
public interface ChineseSocket {
void supplyPowerInChina();
}
被适配者(中式插座实现类):
public class ChineseSocketImpl implements ChineseSocket {
@Override
public void supplyPowerInChina() {
System.out.println("使用中式插座充电成功");
}
}
适配器类(英式兼容中式):
public class ChargerAdapter extends BritishSocketImpl implements ChineseSocket {
@Override
public void supplyPowerInChina() {
supplyPowerInBritish();
}
}
手机类:
public class Mobile {
public void supplyPowerInChina(ChineseSocket chineseSocket) {
chineseSocket.supplyPowerInChina();
}
}
客户端类:
public class Client {
public static void main(String[] args) {
//创建手机对象
Mobile mobile = new Mobile();
System.out.println("------中式插座充电------");
mobile.supplyPowerInChina(new ChineseSocketImpl());
System.out.println("------英式插座充电------");
mobile.supplyPowerInChina(new ChargerAdapter());
}
}
测试结果如下:
类适配器模式违背了合成复用原则,而且受到单一继承的限制,大大限制了类适配器模式的灵活性,所以一般情况下更推荐使用对象适配器模式。
四、适配器模式 —— 对象适配器模式的实现
实现方式:对象适配器模式可采用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。
使用对象适配器模式对上述案例进行改造,类图如下:
具体的类设计如下:
在上述类适配器模式的代码中我们只需要修改适配器类和客户端类的代码即可:
适配器类:
public class ChargerAdapter implements ChineseSocket {
private BritishSocket britishSocket;
public ChargerAdapter(BritishSocket britishSocket) {
this.britishSocket = britishSocket;
}
@Override
public void supplyPowerInChina() {
britishSocket.supplyPowerInBritish();
}
}
客户端类:
public class Client {
public static void main(String[] args) {
//创建手机对象
Mobile mobile = new Mobile();
System.out.println("------中式插座充电------");
mobile.supplyPowerInChina(new ChineseSocketImpl());
System.out.println("------英式插座充电------");
BritishSocketImpl britishSocket = new BritishSocketImpl();
mobile.supplyPowerInChina(new ChargerAdapter(britishSocket));
}
}
测试结果如下:
五、适配器模式的优缺点
优点:
- 解耦性增强: 适配器模式可以将目标接口与具体的实现类解耦,使得它们可以独立演化。
- 复用性提高: 通过适配器,我们可以将已经存在的类或组件集成到新的系统中,而无需修改其原始代码。
- 灵活性增强: 适配器模式允许在不改变现有代码的情况下,适应新的接口或功能。
- 单一职责原则: 适配器类将适配的功能从原始类中分离出来,遵循了单一职责原则。
缺点:
- 增加复杂性: 引入适配器可能会增加代码的复杂性,尤其是当需要适配多个不同的接口或类时。
- 可能导致性能损失: 如果适配器的实现不够高效,可能会引入额外的性能开销。
- 过多使用可能导致混乱: 如果过度使用适配器模式,可能会导致系统结构不清晰,增加维护难度。
- 潜在的误解: 使用适配器模式可能会导致新的开发者误解代码的实际工作方式,特别是当他们不熟悉适配器的存在和用途时。
六、适配器模式的使用场景
以下是适配器模式的一些常见使用场景:
- 集成新功能: 需要在现有系统中集成新的功能或组件而其接口与系统现有接口不匹配时,可以使用适配器模式来适应新功能的接口。
- 使用第三方库或接口: 当系统需要使用第三方库或服务,而其提供的接口与系统不兼容时,适配器可以用于使系统与第三方库协同工作。
- 复用旧代码: 当系统需要复用已有的类,但其接口与系统要求的接口不一致时,适配器可以用于将旧代码适配成符合系统要求的接口。
- 统一接口: 当系统中存在多个类,其接口不一致,而需要统一为一个统一接口时,适配器可以用于统一这些不同接口。
- 适配不同版本: 在系统中存在不同版本的接口,为了保持兼容性,可以使用适配器模式来适配不同版本的接口。
- 移植性增强: 当需要增强系统的移植性,使得系统能够在不同平台上运行时,适配器模式可以用于适配不同平台的接口。
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!