带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

server/2024/12/27 20:47:27/

适配器模式(Adapter Pattern)

适配器模式

适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计模式。它允许不兼容的接口协同工作,通过创建一个适配器类来转换某个类的接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

ok,概念还是太抽象了。来个例子就生动一点。

我们举个手机充电的例子,我们充电头适配的是国内的电网。可是我们国家的电网工作电压与频率不一定与国外的一样,如果我们需要去国外生活或者旅游,怎么办呢? 首先下面我们展示两种充电插头,一种是国标的,另一种是国外的。
在这里插入图片描述
在这里插入图片描述

我们会怎么办呢? 一般来说,我们会买一个充电转换头
在这里插入图片描述
这样的话,我们的充电器就可以在国外正常使用了。其实这样一种实现,就是适配器模式(Adapter Pattern)的体现。

适配器模式(Adapter Pattern)概述

  1. 适配器模式定义与目的
  • 定义:适配器模式是一种结构型设计模式,它使接口不兼容的对象能够协作。适配器充当两个不兼容接口之间的桥梁。
  • 目的:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  1. 适配器模式的实现方式
    在Java中,我们主要通过组合或聚合的方式,在适配器内部包含一个对适配者的引用。

代码案例

java">// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;// 构造函数注入适配者public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void do() {adaptee.does();}
}

talk is cheap, show you my code

我们通过代码构造充电头那个案例。不过我们是让国外的充电实例(充电头)在中国能使用。

java">// 国外充电接口
interface ForeignCharge {void charge(double time);
}// 国内充电接口
interface ChinaCharge {void chongDian(double time);
}// 国外充电接口的实现
class ForeignChargeImpl implements ForeignCharge {@Overridepublic void charge(double time) {System.out.println("charging " + time + " hours");}
}// 适配器类
class ChargeAdapter implements ChinaCharge {private final ForeignCharge foreignCharge;public ChargeAdapter(ForeignCharge foreignCharge) {this.foreignCharge = foreignCharge;}@Overridepublic void chongDian(double time) {// 调用国外充电方法foreignCharge.charge(time);}
}// 客户端代码
public class Test1 {public static void main(String[] args) {// 创建国外充电实例ForeignCharge foreignCharge = new ForeignChargeImpl();// 创建适配器实例ChargeAdapter adapter = new ChargeAdapter(foreignCharge);// 使用适配器调用国外充电实例adapter.chongDian(1.00);}
}

代码详解

ForeignCharge 接口

  • 作用:定义了一个国外使用的充电接口。
  • 方法:charge(double time) - 表示充电的时间。

ChinaCharge 接口

  • 作用:定义了一个国内使用的充电接口。
  • 方法:chongDian(double time) - 表示充电的时间。

ForeignChargeImpl 类实现ForeignCharge 接口方法

ChargeAdapter 类

  • 作用:适配器类,实现了 ChinaCharge 接口,并持有一个 ForeignCharge 对象。
  • 构造方法:ChargeAdapter(ForeignCharge foreignCharge):接受一个 ForeignCharge 对象并存储在 foreignCharge 成员变量中。
  • 方法:chongDian(double time):调用 foreignCharge 的 charge 方法来完成充电操作。

客户端类步骤详解

  1. 创建一个 ForeignChargeImpl 实例,表示国外的充电设备。
  2. 创建一个 ChargeAdapter 实例,并将 ForeignChargeImpl 实例传递给适配器。
  3. 通过适配器调用 chongDian 方法,实际执行的是 ForeignChargeImpl 的 charge 方法。

总结

  1. 适配器模式的过程中一般涉及三个角色:
    1. Target 目标
    2. Adaptee 被适配者
    3. Adapter 适配者
  2. 适配器模式的优点:
  • 提高代码复用性
  • 增加灵活性,因为我们可以灵活选择要适配的对象
  • 降低耦合, 适配者变化的时候,我们只需要修改适配器代码,客户端可以正常使用
  1. 适配器模式应用场景:
  • 遗留系统集成:当你有一个新的系统需要与旧系统中的某些类交互时,可以使用适配器模式来解决接口不匹配的问题。
  • 第三方库集成:当你想使用第三方库中的类,但这些类的接口不符合你的需求时,适配器模式可以帮助你进行转换。
  • API 升级:在升级 API 或更换框架时,适配器模式可以帮助平滑过渡,确保现有代码继续正常工作。

适配器模式是一种非常实用的设计模式,特别是在需要整合现有代码或第三方库时。理解如何正确使用适配器模式可以帮助开发者更有效地组织代码并优化程序设计。


http://www.ppmy.cn/server/153721.html

相关文章

超越细节:在工作和学习中激发创新思维的策略与实践

陷入细节后难以产生创新思路是许多人在工作和学习中常遇到的问题。这种现象背后的原因涉及心理学、认知科学以及工作流程等多个方面。以下是对这一问题的深入分析,以及一些应对策略,帮助您在处理细节的同时保持创新思维。 1. 细节与创新的关系 1.1 认知…

音视频入门知识(三):音频篇

⭐三、音频篇 音频基本要素:采样率、通道数、位宽、采样格式、采样点(像素) 采样率:单位时间内对模拟信号采样的次数 通道数:音频信号的独立声道数量(单通道,双通道(立体声&#xff…

【第2篇】 Python与数据库基础

1. 数据库的基本概念 1.1 表(Table) 表是数据库中存储数据的基本单位,由行和列组成。例如:users 表可以存储用户信息,每一行代表一个用户,每一列代表用户的属性(如姓名、年龄)。 …

Stealthy Attack on Large Language Model based Recommendation

传统RS依赖id信息进行推荐,攻击:生成虚假用户,这些用户对特定目标物体给于高评价,从而影响模型的训练。 基于llm的RS:llm利用语义理解,将用户兴趣转化为语义向量,通过计算用户兴趣向量与物品向…

fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本

注意: 1、不同版本,安装qr code 用法不同。PHP8.0以上用qr code 4.0版本, PHP7.4用 qr code3.0版本 2、项目根目录安装: //安装3.0版本 composer require endroid/qr-code:^3.0//检查安装版本 composer show endroid/qr-code 选…

游戏引擎学习第59天

回顾并计划接下来的一天 在处理实体的空间划分时,遇到了一些问题。例如,虽然树和玩家应该在某些情况下被排除在外,但目前的系统仍然会出现不合逻辑的渲染结果,这在视觉上并不符合预期。尽管这些问题主要是渲染上的,并…

【网络安全零基础入门】PHP环境搭建、安装Apache、安装与配置MySQL(非常详细)零基础入门到精通,收藏这一篇就够(01)_php安装配置教程

这是大白给粉丝朋友准备的网络安全零基础入门第八章PHP入门的知识章节里的环境搭建。 喜欢的朋友们,记得给大白点赞支持和收藏一下,关注我,学习黑客技术。 一、php简介 php定义:一种服务器端的 HTML脚本/编程语言,是…

店铺营业状态设置

admineShopController RestController("admineShopController") RequestMapping("/admin/shop") Api(tags "店铺相关接口") Slf4j public class ShopController {//设置一个常量 因为经常使用public static final String KEY "SHOP-ST…