适配器模式:化解接口冲突,实现完美兼容

65 阅读2分钟

在软件开发中,不同系统或组件之间的接口兼容性是常见挑战。适配器模式类似于电源适配器,解决了这个问题

在现实生活中,电源插座都是 220V 的交流电,当我们要给手机或电脑充电的时候,就需要一个电源适配器进行转换

adapter.jpeg

适配器模式提高了系统灵活性、可维护性和可扩展性,实现完美的兼容性,满足不同系统集成和协作的需求

模式定义

适配器模式是一种结构型设计模式。主要解决接口不兼容的问题,使得原本由于接口不兼容而不能一起工作的那些类或方法可以协同工作,充当适配中间件的角色

模式构成

目标接口 适配转换器 待适配对象 三者构成,通过适配转换器使两者可以完美对接

模式作用

接口转换

适配器模式可以将一个类的接口转换成另一个类所期望的接口,以便两个不兼容的接口能够互相配合工作。通过适配器,客户端可以使用统一的接口与适配器交互,而无需直接与不兼容的类进行通信

旧类重用

当我们需要重用已有的类时,但其接口与新系统的接口不兼容时,可以使用适配器模式。适配器模式可以将旧类的接口转换成新系统所期望的接口,使得旧类可以在新系统中得到复用,避免了重写大量代码

系统集成

在系统开发中,我们经常需要集成各种第三方类库或组件。然而,这些类库的接口规范可能与我们的系统不兼容。通过引入适配器,我们可以将第三方类库的接口转换成我们期望的接口,实现与其无缝集成

组件协作

在面向对象设计中,我们常常将不同的功能模块分离开来,遵循单一职责原则和迪米特法则。然而,这些模块之间可能需要进行协作和通信。适配器模式可以帮助不同模块之间的接口兼容,使得它们能够无缝协作,实现系统的整体功能

实战案例

参数的适配

const DEFAULTS = {
  name: 'adiu', interest: 'coding'
}
function func(options) {
  Object.assign({}, DEFAULTS, options)
}

浏览器兼容性处理

const uuid = () => {
  let uniqueId = null 
  try { 
    uniqueId = crypto.randomUUID() 
  } catch {
    const blobUrl = URL.createObjectURL(new Blob())
    URL.revokeObjectURL(blobUrl)
    uniqueId = blobUrl.slice(blobUrl.lastIndexOf('/') + 1)
  }
  return uniqueId.replace(/-/g, '')
}

数据的适配

接口返回的数据无法满足视图的数据展示

特定的业务场景需要对数据进行适当操作