【设计模式】JAVA Design Patterns——Adapter(适配器模式)

简介: 【设计模式】JAVA Design Patterns——Adapter(适配器模式)

🔍目的


将一个接口转换成另一个客户所期望的接口。适配器让那些本来因为接口不兼容的类可以合作无间。


🔍解释


现实世界例子

考虑有这么一种情况,在你的存储卡中有一些照片,你想将其传到你的电脑中。为了传送数据,你需要某种能够兼容你电脑接口的适配器以便你的储存卡能连上你的电脑。在这种情况下,读卡器就是一个适配器。

另一个例子就是注明的电源适配器;三脚插头不能插在两脚插座上,需要一个电源适配器来使其能够插在两脚插座上。


通俗描述

适配器模式让你可以把不兼容的对象包在适配器中,以让其兼容其他类。


维基百科

软件工程中,适配器模式是一种可以让现有类的接口把其作为其他接口来使用的设计模式。它经常用来使现有的类和其他类能够工作并且不用修改其他类的源代码


代码示例

假如有一个船长他只会划船,但不会航行。

首先我们有接口RowingBoatFishingBoat

public interface RowingBoat {
  void row();
}
 
@Slf4j
public class FishingBoat {
  public void sail() {
    LOGGER.info("The fishing boat is sailing");
  }
}


希望有一个RowingBoat接口的实现,船长这样就可以移动

public class Captain {
 
  private final RowingBoat rowingBoat;
  // default constructor and setter for rowingBoat
  public Captain(RowingBoat rowingBoat) {
    this.rowingBoat = rowingBoat;
  }
 
  public void row() {
    rowingBoat.row();
  }
}


现在海盗来了,我们的船长需要逃跑但是只有一个渔船可用。需要创建一个可以让船长使用其划船技能来操作渔船的适配器。

@Slf4j
public class FishingBoatAdapter implements RowingBoat {
 
  private final FishingBoat boat;
 
  public FishingBoatAdapter() {
    boat = new FishingBoat();
  }
 
  @Override
  public void row() {
    boat.sail();
  }
}
 


现在 船长 可以使用FishingBoat接口来逃离海盗了。

1. var captain = new Captain(new FishingBoatAdapter());
2. captain.row();


🔍类图

8822ebfbf9104366a1cbfaa75600eb89.png

🔍适用场景

  • 你想使用一个已有类,但是它的接口不能和你需要的所匹配
  • 你需要创建一个可重用类,该类与不相关或不可预见的类进行协作,即不一定具有兼容接口的类
  • 你需要使用一些现有的子类,但是子类化他们每一个的子类来进行接口的适配是不现实的。一个对象适配器可以适配他们父类的接口。
  • 大多数使用第三方类库的应用使用适配器作为一个在应用和第三方类库间的中间层来使应用和类库解耦。如果必须使用另一个库,则只需使用一个新库的适配器而无需改变应用程序的代码。


🔍结果

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

一个类适配器

  • 适配被适配者到目标接口,需要保证只有一个具体的被适配者类。作为结果,当我们想适配一个类和它所有的子类时,类适配器将不会起作用。
  • 可以让适配器重写一些被适配者的行为,因为适配器是被适配者的子类。
  • 只引入了一个对象,并且不需要其他指针间接访问被适配者。


对象适配器

  • 一个适配器可以和许多被适配者工作,也就是被适配者自己和所有它的子类。适配器同时可以为所有被适配者添加功能。
  • 覆盖被适配者的行为变得更难。需要子类化被适配者然后让适配器引用这个子类不是被适配者

82108c8d813e4565a341ce893bed0393.gif

相关文章
|
26天前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
1天前
|
设计模式 开发框架 Java
java设计模式面试题大全含答案
java设计模式面试题大全含答案
|
2天前
|
设计模式 监控 安全
屏幕监控软件的设计模式:深入理解Java EE
在Java EE环境中,屏幕监控软件采用生产者-消费者设计模式,`ScreenCaptureProducer`类捕获屏幕数据并放入队列,`ScreenCaptureConsumer`负责处理和提交。数据每5分钟通过定时任务和RESTful API自动提交至网站,提升管理效率。该方案支持实时监控、数据分析和高效的数据处理。
21 2
|
28天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
8天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
9 1
|
14天前
|
设计模式 Java C#
【设计模式】第六篇:来康康适配器模式
类适配器模式 主要使用继承实现,耦合度高,且在单继承的语言中使用会受限,还需要防止继承带来的一些问题
18 5
|
2天前
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
2天前
|
设计模式 Java Spring
java设计模式总结
java设计模式总结
|
26天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
15天前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
147 0

热门文章

最新文章