适配器模式简介
概念:
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作。
特点:
- 通过适配器,可以使原本因为接口不匹配而无法合作的类能够一起工作。
- 适配器模式可以在不修改现有代码的情况下实现对目标对象方法和属性的访问。
- 可以使用多个适配器同时进行适配。
优点:
- 提供了代码复用性,可以重用已有功能而无需修改源代码。
- 实现了解耦,使得客户端与目标对象之间松耦合。
- 增加了系统灵活性和可扩展性。
缺点:
- 增加了系统复杂性,引入了额外的类和对象。
- 在某些情况下会导致系统过度设计。
适用场景:
- 当一个对象的改变需要同时影响其他多个对象时。
- 当系统中存在一些对象之间的联动行为,但又希望它们之间解耦合时。
实现方式:
类适配器
实现原理:
- 定义目标接口(Target),该接口是客户端所期望的接口。
- 创建一个适配者类(Adaptee),该类包含了需要被适配的方法。
- 创建一个适配器类(ClassAdapter),该类继承自适配者类并实现目标接口,通过继承关系同时具有了适配者和目标接口的特性。在适配器中调用适配者的方法来完成对目标接口方法的实现。
实现代码:
// 目标接口
interface Target {void request();
}// 适配者类
class Adaptee {public void specificRequest() {System.out.println("Adaptee specific request");}
}// 类适配器,通过继承实现
class ClassAdapter extends Adaptee implements Target {@Override public void request() { specificRequest(); // 调用被适配者的方法 }
}
上述代码中,我们定义了一个目标接口 Target ,其中包含了客户端所期望调用的方法。然后创建一个具体的被适应对象 Adaptee ,它包含了需要被转换成目标对象调用形式但不兼容于 Target 接口规范定义 的方法。
接着,我们创建一个适配器类 ClassAdapter ,该类继承自被适应对象 Adaptee 并实现了目标接口 Target 。在适配器中,通过调用被适应对象的方法来完成对目标接口方法的实现。
使用类适配器方式可以使得客户端能够通过目标接口调用到被适应对象的方法,从而实现了两个不兼容接口之间的协同工作。
存在问题:
- 类适配器方式只能对单一的具体类进行适配,无法同时对多个具体类进行适配。
- 由于采用继承关系,当需要同时继承多个父类时会受到Java单继承限制。
尽管存在以上问题,使用类适配器方式可以较为简单地将一个已有的类转换成满足客户端需求的新类型。
对象适配器
实现原理:
- 定义目标接口(Target),该接口是客户端所期望的接口。
- 创建一个适配者类(Adaptee),该类包含了需要被适配的方法。
- 创建一个适配器类(ObjectAdapter),该类实现目标接口,并在内部持有一个适配者对象的引用。通过调用适配者对象的方法来完成对目标接口方法的实现。
实现代码:
// 目标接口
interface Target {void request();
}// 适配者类
class Adaptee {public void specificRequest() {System.out.println("Adaptee specific request");}
}// 对象适配器,通过组合实现
class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Override public void request() { adaptee.specificRequest(); // 调用被适应对象的方法 }
}
上述代码中,我们定义了一个目标接口 Target ,其中包含了客户端所期望调用的方法。然后创建一个具体的被适应对象 Adaptee ,它包含了需要被转换成目标对象调用形式但不兼容于 Target 接口规范定义的方法。
接着,我们创建一个适配器类 ObjectAdapter ,该类实现了目标接口 Target 并在内部持有一个适应者对象 Adaptee 的引用。在适配器中,通过调用被适应对象的方法来完成对目标接口方法的实现。
使用对象适配器方式可以使得客户端能够通过目标接口调用到被适应对象的方法,从而实现了两个不兼容接口之间的协同工作。
存在问题:
- 对象适配器方式需要额外创建一个适配器类和持有被适应对象的引用,可能会增加代码复杂性。
- 当需要同时继承多个父类时会受到Java单继承限制。
使用对象适配器方式可以较为灵活地将一个已有的类转换成满足客户端需求的新类型,并且可以支持对多个具体类进行适配。
接口适配器
实现原理:
- 定义目标接口(Target),该接口是客户端所期望的接口。
- 创建一个抽象适配器类(Adapter),该类实现了目标接口,并提供了默认的空方法实现,以便让子类选择性地覆盖需要的方法。
- 创建具体的适配器子类,继承自抽象适配器类,并根据需要重写其中的方法。
// 目标接口
interface Target {void method1();void method2();
}// 抽象适配器
abstract class Adapter implements Target {public void method1() {} // 默认空方法实现public void method2() {} // 默认空方法实现
}// 具体适配器子类,根据需要选择性地覆盖父类方法
class ConcreteAdapter extends Adapter {@Override public void method1() { System.out.println("ConcreteAdapter's method1");}
}
上述代码中,我们定义了一个目标接口 Target
,其中包含了客户端所期望调用的多个方法。然后创建一个抽象适应器类 Adapter
,该类实现了目标接口并提供了默认的空方法实现。
最后,我们创建具体的适应器子类 ConcreteAdapter
,该类继承自抽象适配器类,并根据需要选择性地覆盖其中的方法。在这个例子中,我们只重写了 method1
方法。
使用接口适配器方式可以使得客户端能够选择性地实现目标接口中的方法,而不需要强制实现所有的方法。
存在问题:
- 接口适配器方式可能会导致类的层次结构变得复杂。
- 当需要同时继承多个父类时会受到Java单继承限制。
使用接口适配器方式可以提供更大的灵活性和可定制性,让客户端能够根据自身需求选择要实现的方法。
相关文章:
适配器模式简介
概念: 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作。 特点: 通过适配器,可以使原本因为接口不匹配而无法…...
MyBatis —— 多种查询及映射关系
前言 上一篇文章中荔枝梳理了有关MyBatis的相关环境配置和核心配置文件及其模板的设置和生成,而在这篇文章中荔枝会着重梳理MyBatis多种查询情况、特殊SQL执行以及两表联查时映射关系的处理。希望对需要的小伙伴有帮助~~~ 文章目录 前言 一、多种查询情况 1.1 查…...

腾讯云服务器镜像TencentOS Server操作系统详细介绍
腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统,完全兼容CentOS生态和操作方式,TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境,TencentOS可以运行在腾讯云CVM全规格实例上,包括黑石物理…...

Docker 中下载各版本的 CentOS、CentOS Steam 方式
如果你跟我一样,想要在docker下载centos的镜像,但是无奈访问不了 https://hub.docker.com/,于是不知道有哪些tag可以下载,该如何办呢? 方法如下,以供参考。 访问:https://quay.io/repository/…...

多线程使用HashMap,HashMap和HashTable和ConcurrentHashMap区别(面试题常考),硬盘IO,顺便回顾volatile
一、回顾💛 谈谈volatile关键字用法 volatile能够保证内存可见性,会强制从主内存中读取数据,此时如果其他线程修改被volatile修饰的变量,可以第一时间读取到最新的值。 二、💙 HashMap线程不安全没有锁,HashTable线程…...

专线连接交换机设置 – 如何实现高效率的网络连接?
专线链接交换机设置 – 如何实现高效率的网络连接? 什么是专线连接交换机? 在现代互联网中,网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说,专线连接交换机是一项非常重要的技…...

C#,数值计算——Midexp的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Midexp : Midpnt { public new double func(double x) { return funk.funk(-Math.Log(x)) / x; } public Midexp(UniVarRealValueFun funcc, double aa, d…...
微信小程序使用本地存储方法wx.setStorageSync()和wx.getStorageSync()
微信小程序的本地存储可以使用wx.setStorageSync()和wx.getStorageSync()方法实现 使用wx.setStorageSync()方法可以将数据以键值对的方式存储到本地存储中: wx.setStorageSync(demo, demo123);获取数据:使用wx.getStorageSync()方法可以从本地存储中获…...
题解:ABC317C - Remembering the Days
题解:ABC317C - Remembering the Days 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:B。 思维难度:B。 调码难度:C。 综合评价:普及-。 算法 深度优先搜索。 思路 先建图&#x…...

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出
需求 在资金明细的页面中,点击按钮时筛选区域从左侧滑出,完成筛选点击确认后调用接口完成数据查询,筛选区域滑入左侧; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…...
LeetCode——最大子数组和(中等)
题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#x…...
Zookeeper集成SpringBoot
Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如:原生JavaAPI、Curator、ZkClient等。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

ModaHub魔搭社区:星环科技致力于打造更优越的向量数据库
在数字化时代,数据成为了最重要的资源之一。随着人工智能、大数据等技术的不断发展,向量数据库成为了处理这类数据的关键工具。星环科技作为一家专注于数据存储和管理技术的公司,其重要目标就是将向量数据库打造得更为优越。 在星环科技,有一个专注于向量数据库的团队。这个…...
Dubbo默认使用什么序列化框架?还有哪些?
Dubbo默认使用的序列化框架是Hessian 2.0。Hessian是一种基于二进制的序列化协议,它具有简单、高效的特点,适用于网络传输和存储数据。Hessian在Dubbo中被广泛使用,因为它可以在不同的编程语言之间进行对象的序列化和反序列化。 除了Hessian…...

攻防世界-What-is-this
原题 解题思路 解压后文件 没有后缀,不知道是什么文件。用notepad打开找不到flag。 尝试当成压缩包解压。 用stegsolve以打开图片1, 合成两张图片。...

[C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数
个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!ǹ…...
【跟小嘉学 Rust 编程】二十一、网络编程
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

一文了解聚合支付
第四方支付是相对于第三方支付而提出的概念,又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之,把支付接口聚合到一个平台上面,来给商家或者个人来提供支付服务。 第四方支付集中了各…...

118.杨辉三角
一、题目 118. 杨辉三角 - 力扣(LeetCode) 二、代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>data(numRows);for(int i0;i<numRows;i){data[i].resize(i1);//扩容data[i]…...

第7节——渲染列表+Key作用
一、列表渲染 我们再react中如果渲染列表,一般使用map方法进行渲染 import React from "react";export default class LearnJSX2 extends React.Component {state {infos: [{name: "张三",age: 18,},{name: "李四",age: 20,},{nam…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...