当前位置: 首页 > news >正文

设计模式-适配器模式 Adapter

适配器模式 (Adapter) (重点)

适配器设计模式(Adapter Design Pattern)是一种结构型设计模式,用于解决两个不兼容接口之间的问题。适配器允许将一个类的接口转换为客户端期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

在适配器设计模式中,主要包含以下四个角色:

  1. 目标接口(Target):这是客户端期望使用的接口,它定义了特定领域的操作和方法。
  2. 需要适配的类(Adaptee):这是一个已存在的类,它具有客户端需要的功能,但其接口与目标接口不兼容。适配器的目标是使这个类的功能能够通过目标接口使用。
  3. 适配器(Adapter):这是适配器模式的核心角色,它实现了目标接口并持有需要适配的类的一个实例。适配器通过封装Adaptee的功能,使其能够满足Target接口的要求。
  4. 客户端(Client):这是使用目标接口的类。客户端与目标接口进行交互,不直接与需要适配的类交互。通过使用适配器,客户端可以间接地使用需要适配的类的功能。

适配器模式的主要目的是在不修改现有代码的情况下,使不兼容的接口能够协同工作。通过引入适配器角色,客户端可以使用目标接口与需要适配的类进行通信,从而实现解耦和扩展性。

适配器模式有两种实现方式:类适配器和对象适配器。

类适配器

类适配器使用继承来实现适配器功能。适配器类继承了原有的类(Adaptee)并实现了目标接口(Target)

// 目标接口
interface Target {void request();
}// 需要适配的类(Adaptee)
class Adaptee {void specificRequest() {System.out.println("Adaptee's specific request");}
}// 类适配器
class ClassAdapter extends Adaptee implements Target {@Overridepublic void request() {specificRequest();}
}public class ClassAdapterExample {public static void main(String[] args) {Target target = new ClassAdapter();target.request();}
}

对象适配器

对象适配器使用组合来实现适配器功能。适配器类包含一个原有类的实例(Adaptee)并实现了目标接口(Target)

// 目标接口
interface Target {void request();
}// 需要适配的类(Adaptee)
class Adaptee {void specificRequest() {System.out.println("Adaptee's specific request");}
}// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificReq uest();}
}public class ObjectAdapterExample {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new ObjectAdapter(adaptee);target.request();}
}

适配器模式可以用于解决不同系统、库或API之间的接口不兼容问题,使得它们可以协同工作。在实际开发中,应根据具体需求选择使用类适配器还是对象适配器。

http://www.lryc.cn/news/300542.html

相关文章:

  • 算法训练day29Leetcode491递增子序列46全排列47全排列Ⅱ
  • 内网穿透与搭建私人服务器
  • 交大论文下载器
  • 全栈笔记_浏览器扩展篇(manifest.json文件介绍)
  • 蓝桥杯每日一题(python)
  • 【Vue】工程化开发脚手架Vue CLI
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)
  • LeetCode “AddressSanitizer:heat-use-after-free on address“问题解决方法
  • 幸运彩票
  • 搭建yum仓库服务器
  • 贪心算法练习day1
  • [VulnHub靶机渗透] WestWild 1.1
  • 如何使用 ControlValueAccessor 在 Angular 中创建自定义表单控件
  • 视频讲解:优化柱状图
  • OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区
  • Solidworks:平面草图练习
  • React18原理: 渲染与更新时的重点关注事项
  • 嵌入式I2C 信号线为何加上拉电阻(图文并茂)
  • Vite 5.0 正式发布
  • 嵌入式STM32 单片机 GPIO 的工作原理详解
  • 系统调用的概念
  • 【无标题】Matlab 之axes函数——创建笛卡尔坐标区
  • 2.12:C语言测试题
  • 【Linux】yum软件包管理器
  • 「优选算法刷题」:寻找旋转排序数组中的最小值
  • MySQL 基础入门指南:从安装到基本操作
  • 嵌入式Qt Qt Creator安装与工程介绍
  • Windows 系统盘(C盘)爆红如何清理、如何增加C盘空间
  • 【JavaEE Spring】Spring 原理
  • 【Crypto | CTF】RSA打法