适配器模式(Adapter)

栏目: 后端 · 发布时间: 4年前

内容简介:将类的接口转换为客户端期望的另一个接口。适配器允许类一起工作,否则由于接口不兼容而无法一起工作。

目的

将类的接口转换为客户端期望的另一个接口。适配器允许类一起工作,否则由于接口不兼容而无法一起工作。

说明

您的存储卡中有一些照片,需要将它们传输到计算机上。为了传输它们,您需要某种与您的计算机端口兼容的适配器,以便您可以将存储卡连接到您的计算机。在这种情况下,读卡器就是是适配器。另一个例子是电源适配器,三脚插头不能连接到双脚插座,需要使用电源适配器,使其与双脚插座兼容。另一个例子是翻译将一个人所说的话翻译给另一个人。

简而言之

适配器模式允许您在适配器中包装一个原本不兼容的对象,使其与另一个类兼容。

维基百科说

在软件工程中,适配器模式是一种软件设计模式,它允许将现有类的接口用作另一个接口。它通常用于在不修改源代码的情况下使现有类与其他类一起工作。

程序示例

考虑一个只会使用划艇但根本不能驾船的船长。

首先我们要有划艇和渔船的接口

<b>public</b> <b>interface</b> RowingBoat {
  <b>void</b> row();
}

<b>public</b> <b>class</b> FishingBoat {
  <b>private</b> <b>static</b> <b>final</b> Logger LOGGER = LoggerFactory.getLogger(FishingBoat.<b>class</b>);
  <b>public</b> <b>void</b> sail() {
    LOGGER.info(<font>"The fishing boat is sailing"</font><font>);
  }
}
</font>

其次船长期望划艇接口的实现能够移动

<b>public</b> <b>class</b> Captain implements RowingBoat {

  <b>private</b> RowingBoat rowingBoat;

  <b>public</b> Captain(RowingBoat rowingBoat) {
    <b>this</b>.rowingBoat = rowingBoat;
  }

  @Override
  <b>public</b> <b>void</b> row() {
    rowingBoat.row();
  }
}

现在假设海盗来了,我们的船长需要逃离,但只有渔船可用。我们需要创建一个适配器,允许船长用他的划艇技能操作渔船。

<b>public</b> <b>class</b> FishingBoatAdapter implements RowingBoat {

  <b>private</b> <b>static</b> <b>final</b> Logger LOGGER = LoggerFactory.getLogger(FishingBoatAdapter.<b>class</b>);

  <b>private</b> FishingBoat boat;

  <b>public</b> FishingBoatAdapter() {
    boat = <b>new</b> FishingBoat();
  }

  @Override
  <b>public</b> <b>void</b> row() {
    boat.sail();
  }
}

现在船长可以用渔船来躲避海盗。

Captain captain = <b>new</b> Captain(<b>new</b> FishingBoatAdapter());
captain.row();

适用场景

  • 您想使用现有的类,但它的接口与您需要的接口不匹配
  • 你想创建一个可重用的类,让它与不相关或不可预见的类(即不一定具有兼容接口的类)协作。
  • 你需要使用几个现有的子类,但通过对每个子类进行子类化来调整它们的接口是不切实际的。对象适配器可以调整其父类的接口。
  • 大多数使用第三方库的应用程序使用适配器作为应用程序和第三方库之间的中间层,以将应用程序与库分离。如果必须使用另一个库,则只需要新库的适配器,而无需更改应用程序代码。

后果:

类适配器和对象适配器有不同的权衡。

类适配器

  • 通过提交到具体的adaptee类使adaptee适应目标。因此,当我们想要调整类及其所有子类时,类适配器将不起作用。
  • 让适配器重写适配者(Adaptee)的一些行为,因为适配器是适配者的子类。
  • 只引入一个对象,不需要额外的指针间接指向适配者。

对象适配器

  • 一个适配器可以把许多适配者类和它的子类都适配到目标接口。适配器还可以立即向所有适配者添加功能。
  • 使得置换适配者行为变得非常困难。它将需要先子类化Adaptee,再使适配器适配子类而不是Adaptee本身。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

阿里巴巴正传:我们与马云的“一步之遥”

阿里巴巴正传:我们与马云的“一步之遥”

方兴东、刘伟 / 江苏凤凰文艺出版社 / 2015-1 / 45.00

十几年来,方兴东与马云每年一次,老友聚首,开怀畅谈,阿里上市前,作者再次与马云深度对话,阿里上市前的布局,深入探讨了一系列人们关心的话题。 本书忠实记录了阿里壮大、马云封圣的历史。作者通过细致梳理和盘点,对阿里巴巴的15年成长史进行了忠实回顾。从海博翻译社到淘宝网,从淘宝商城到天猫,从支付宝到阿里云计算,从拉来软银的第一笔投资到纽交所上市,作者对其中涉及到的人物、细节都有生动展现;对于马云、......一起来看看 《阿里巴巴正传:我们与马云的“一步之遥”》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具