Skip to content

适配器模式

亦称: 封装器模式、Wrapper、Adapter

1. 简介

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。
Alt text

2. 真实世界类比

适配器模式的主要作⽤就是把原本不兼容的接口,通过适配修改做到统⼀。使得⽤户⽅便使⽤,就像我们提到的万能充、数据线、MAC笔记本的转换头、出国旅游买个插座等等,他们都是为了适配各种不同的接口 ,做的兼容。 Alt text

2. 模拟场景

假如你正在开发一款股票市场监测程序, 它会从不同来源下载XML格式的股票数据, 然后向用户呈现出美观的图表。在开发过程中, 你决定在程序中整合一个第三方智能分析函数库。但是遇到了一个问题, 那就是分析函数库只兼容 JSON 格式的数据。 Alt text 你可以修改程序库来支持XML。但是, 这可能需要修改部分依赖该程序库的现有代码。甚至还有更糟糕的情况, 你可能根本没有程序库的源代码, 从而无法对其进行修改。

3. 解决方案

你可以创建一个适配器。这是一个特殊的对象, 能够转换对象接口, 使其能与其他对象进行交互。

适配器模式通过封装对象将复杂的转换过程隐藏于幕后。被封装的对象甚至察觉不到适配器的存在。例如, 你可以使用一个将所有数据转换为英制单位 (如英尺和英里)的适配器封装运行于米和千米单位制中的对象。

适配器不仅可以转换不同格式的数据, 其还有助于采用不同接口的对象之间的合作。它的运作方式如下:

  1. 适配器实现与其中一个现有对象兼容的接口。
  2. 现有对象可以使用该接口安全地调用适配器方法。
  3. 适配器方法被调用后将以另一个对象兼容的格式和顺序将请求传递给该对象。
    Alt text
    有时你甚至可以创建一个双向适配器来实现双向转换调用。让我们回到股票市场程序。为了解决数据格式不兼容的问题, 你可以为分析函数库中的每个类创建将 XML 转换为 JSON 格式的适配器, 然后让客户端仅通过这些适配器来与函数库进行交流。当某个适配器被调用时, 它会将传入的 XML 数据转换为 JSON 结构, 并将其传递给被封装分析对象的相应方法。

4. Java中的例子

  • java.util.Arrays#asList()
  • java.util.Collections#list()
  • java.util.Collections#enumeration()
  • java.io.InputStreamReader(InputStream) (返回Reader对象)
  • java.io.OutputStreamWriter(OutputStream) (返回Writer对象)
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal()和#unmarshal()