当前位置: 首页 > article >正文

初识设计模式 - 适配器模式

适配器在生活中经常见到,如手机、笔记本电脑的电源适配器,USB 转接头都是常见的适配器。

在设计模式当中,适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

在类适配器模式中,适配器与适配者之间是继承(实现)关系;在对象适配器模式中,适配器与适配者之间是关联关系。

具体实现

类适配器模式

典型的类适配器模式代码示例如下:

 
class Adapter extends Adaptee implements Target {
public void request() {
// 转发调用
super.specificRequest();
}
}

从上述的代码可以看出,典型的类适配器模式就是通过继承的方式,使用子类方法调用父类的方法,使用者在使用时面对的是适配器类而不是原始类。

对象适配器模式

典型的对象适配器模式代码示例如下:

 
class Adapter extends Target {
// 维持一个对适配者的引用
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
// 转发调用
adaptee.specificRequest();
}
}

代理、桥接、装饰器、适配器的区别

笼统地说,这 4 种设计模式可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

尽管它们的代码结构类似,但这 4 种设计模式的用意完全不同,以下是它们简要描述:

  • 代理模式:代理类在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它与装饰器模式最大的不同
  • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变
  • 装饰器模式:装饰器模式在不改变原始类接口的情况下,对原始类功能进行加强,并且支持多个装饰器的嵌套使用
  • 适配器模式:适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口,适配器模式是一种事后的补救策略

总结

优点

适配器模式的主要优点如下:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性
  • 灵活性和扩展性都非常好

除上述以外,对象适配器模式还有以下优点:

  • 一个对象适配器可以把多个不同的适配器适配到同一个目标
  • 可以适配一个适配者的子类

缺点

类适配器模式的主要缺点如下:

  • 对于不支持多重继承的编程语言,一次最多只能适配一个适配者类,不能同时适配多个适配者
  • 适配者类必须是可被继承的
  • 对于不支持多重继承的编程语言,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

对象适配器模式的主要缺点如下:

  • 与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦

适用场景

适配器模式的适用场景如下:

  • 封装有缺陷的接口设计
  • 统一多个类的接口设计
  • 替换依赖的接口设计
  • 兼容老版本接口
  • 适配不同格式的数据

源码

在 Java 中,SLF4J 日志框架不仅仅提供了统一的接口定义,还提供了针对不同日志框架的适配器。对不同日志框架的接口进行二次封装,适配成统一的 SLF4J 接口定义。


http://www.kler.cn/a/6477.html

相关文章:

  • stm32制作CAN适配器5--WinUsb上位机编写
  • 第一次面试到第一份offer的经历分享
  • 如何在window 使用 conda 环境下载大模型
  • powershell美化
  • 3. Kafka入门—安装与基本命令
  • 【AI知识】为什么激活值过大/过小,初始权重过大/过小,可能导致梯度爆炸/消失?具体例子举例
  • 【python设计模式】8、桥接模式
  • Python入门教程+项目实战-7.2节: 循环控制结构
  • 【Python入门第四十二天】Python丨NumPy 数组裁切
  • 自定义starter
  • 【Ruby学习笔记】4.Ruby 类和对象及类案例
  • OBProxy 路由策略与使用运维-常见问题
  • FIFO的工作原理及其设计
  • 哈利波特c++千行代码
  • C语言程序环境和预处理
  • USB抓包分析
  • Spring Security
  • 【C语言蓝桥杯每日一题】—— 递增序列
  • C 学习笔记 —— 结构(二)
  • 【面试】互联网相关面试题
  • 操作系统结构
  • 【C语言学习】预处理命令
  • 【从零开始学习 UVM】10.7、UVM TLM —— TLM Fifo [uvm_tlm_fifo]
  • [windows-rs]Rust 调用 Windows API
  • 2023-4-1刷提情况
  • C++内存模型