二十三种设计模式之适配器模式

embedded/2024/9/23 7:01:16/

1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 为什么要引入适配器模式

在软件开发的海洋中,我们经常会遇到各种不同的系统和组件,它们可能由于设计时的考虑不周或技术演进导致接口不兼容。这时,适配器模式(Adapter Pattern)就成为了我们解决问题的利器。

3. 什么是适配器模式

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器让那些接口不兼容的类可以一起工作,从而提高了类的复用性。

最常见的比喻是电源适配器。当你出国旅行时,可能会遇到电源插座与你的电子设备充电器不匹配的情况。这时,你需要一个电源适配器来转换插头的形状和电压,使得你的充电器能够适应当地的电源插座。在这个比喻中:

  • 目标接口:是你电子设备的充电器接口。
  • 被适配者:是目的地国家的电源插座。
  • 适配器:是实际的电源适配器,它连接了两者。

4. 适配器模式的分类

适配器模式主要分为两种类型:

  1. 适配器模式:通过多重继承将一个类的接口转换成另一个接口。在不支持多重继承的语言中,通常使用组合的方式来实现。

  2. 对象适配器模式:通过创建一个包装对象,将请求从一个对象传递到另一个对象。

5. 类适配器模式

5.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类,其接口与目标接口不兼容。
  • Adapter(适配器):继承Adaptee并实现Target接口。

5.2 示例

假设我们有一个旧的系统,它提供了一个Adaptee类,该类有一个specificRequest方法。现在,我们需要在新的系统中使用这个类,但新系统的接口是Target接口,它期望有一个request方法。

// 目标接口
public interface Target {void request();
}// 被适配者
public class Adaptee {public void specificRequest() {System.out.println("Specific Request");}
}// 适配器
public class Adapter extends Adaptee implements Target {@Overridepublic void request() {specificRequest();}
}// 客户端代码
public class Client {public static void main(String[] args) {Target target = new Adapter();target.request();}
}

在这个例子中,Adapter类继承了Adaptee类并实现了Target接口,使得原本不兼容的Adaptee类可以通过Adapter来满足Target接口的需求。

6. 对象适配器模式

6.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类。
  • Adapter(适配器):持有Adaptee的引用并实现Target接口。

6.2 示例

对象适配器模式与类适配器模式的主要区别在于,对象适配器模式使用组合而非继承。

// 目标接口
public interface Target {void request();
}// 被适配者
public class Adaptee {public void specificRequest() {System.out.println("Specific Request");}
}// 适配器
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

7. 适配器模式的应用场景

适配器模式通常用于以下场景:

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要。
  2. 想要建立一个可重复使用的类,用来与一些彼此之间没有太大关系的类一起工作,包括一些可能在将来引进的类。

8. 适配器模式的优点

  • 提高类的复用性:通过适配器模式,我们可以重用现有的类,而不需要修改它们的代码。
  • 解耦系统组件适配器模式提供了一个中间层,使得系统组件之间的依赖关系减少,提高了系统的灵活性。

9. 适配器模式的缺点

  • 增加系统的复杂性:如果过度使用适配器模式,可能会使得系统结构变得复杂,增加理解和维护的难度。

10. 结论

适配器模式是一种强大的设计模式,它可以帮助我们在不修改原有代码的情况下,实现不同系统或组件之间的协同工作。通过合理地使用适配器模式,我们可以提高软件的复用性和灵活性,但也要注意避免过度使用,以免增加系统的复杂性。


http://www.ppmy.cn/embedded/114380.html

相关文章

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制(ACK) 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号,之后会介…

Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析

目录 一、场景 1.1 错误分析 1.2 解决方法尝试 1.2.1 检查应用的安装位置 1.2.2 使用ADB安装 1.2.3 检查APK的签名 1.2.4 检查可用的内部存储空间 1.2.5 将应用程序安装到设备的内部存储空间 1.2.6 重置设备(谨慎使用) 1.2.7 获取Root权限&…

链动321模式开发系统解析源码

链动321模式是一种结合了区块链技术、动态激励机制与“321”运营模式的新型电商架构。该模式通过激励用户分享和推广,实现用户、企业和平台的共赢,具有独特的商业逻辑和高效的运营机制。以下是对链动321模式的详细解析: 系统特点 裂变迅速&am…

HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)

在 HarmonyOS-NEXT 开发中,网络请求是应用开发中不可或缺的一部分。为了提高开发效率和代码复用性,我们可以封装一个好用的网络模块组件。本文将介绍如何在 HarmonyOS-NEXT 中封装一个功能强大且易于使用的网络模块组件。 封装目的 网络模块使用的频率最…

变量的作用域和生命周期

大家好我是清墨,欢迎收看本期文章。 1. 数据存储的 3 要素 计算机程序在存储数据时必须跟踪 3 个基本属性: 信息存储在何处,在什么地方定义变量,决定了信息存储在何处存储的值是多少,值是多少是通过赋值语句&#xff…

Java 基础知识九(网络编程)

UDP DatagramSocket:通讯的数据管道 -send 和receive方法 -(可选,多网卡)绑定一个IP和Port DatagramPacket -集装箱:封装数据 -地址标签:目的地IPPort package org.example.net;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.n…

Matlab R2024B软件安装教程

一、新版本特点 MATLAB R2024B版本带来了众多新特性和改进,旨在提升用户的内容创作体验和工程效率。以下是该版本的一些主要特点: 1. 性能提升和优化:R2024B版本在性能上进行了显著优化,无论是在提问、回答问题、发布新技巧还是…

mybatisplus中id生成策略

使用Tableld(value,type) 1.typeIdType.AUTO自增主键 2.typeIdType.ASSIGN,雪花算法生成 mybatisplus id生成策略全局配置 配置表前缀以及id生成策略 mybatis-plus:global-config:db-config:id-type: autotable-prefix: :t_