适配器模式(Adapter)

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

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

目的

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

说明

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

简而言之

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

维基百科说

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

程序示例

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

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

<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本身。

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

查看所有标签

猜你喜欢:

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

来吧!带你玩转 Excel VBA

来吧!带你玩转 Excel VBA

罗刚君、杨嘉恺 / 电子工业出版社 / 2013-7 / 85.00元

本书旨在普及Excel VBA 基础理论,以及通过VBA 的高级应用扩展Excel 的功能,提升读者的制表效率,解决工作中的疑难,同时亦可借此开发商业插件。 本书主要分为操作自动化引言篇、入门篇、进阶篇和疑难解答篇,覆盖从入门到提高的所有内容,以满足不同层次的读者需求。其中操作自动化引言篇简述了操作自动化的需求与方式,借此引出VBA 入门篇。VBA 入门篇包含第2 章到第13 章,主要介绍了......一起来看看 《来吧!带你玩转 Excel VBA》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具