适配器模式简介

概念

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作。

特点

  1. 通过适配器,可以使原本因为接口不匹配而无法合作的类能够一起工作。
  2. 适配器模式可以在不修改现有代码的情况下实现对目标对象方法和属性的访问。
  3. 可以使用多个适配器同时进行适配。

优点

  1. 提供了代码复用性,可以重用已有功能而无需修改源代码。
  2. 实现了解耦,使得客户端与目标对象之间松耦合。
  3. 增加了系统灵活性和可扩展性。

缺点

  1. 增加了系统复杂性,引入了额外的类和对象。
  2. 在某些情况下会导致系统过度设计。

适用场景

  1. 当一个对象的改变需要同时影响其他多个对象时。
  2. 当系统中存在一些对象之间的联动行为,但又希望它们之间解耦合时。

实现方式

类适配器

实现原理:

  1. 定义目标接口(Target),该接口是客户端所期望的接口。
  2. 创建一个适配者类(Adaptee),该类包含了需要被适配的方法。
  3. 创建一个适配器类(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 。在适配器中,通过调用被适应对象的方法来完成对目标接口方法的实现。

使用类适配器方式可以使得客户端能够通过目标接口调用到被适应对象的方法,从而实现了两个不兼容接口之间的协同工作。

存在问题:

  1. 类适配器方式只能对单一的具体类进行适配,无法同时对多个具体类进行适配。
  2. 由于采用继承关系,当需要同时继承多个父类时会受到Java单继承限制。

尽管存在以上问题,使用类适配器方式可以较为简单地将一个已有的类转换成满足客户端需求的新类型。

对象适配器

实现原理:

  1. 定义目标接口(Target),该接口是客户端所期望的接口。
  2. 创建一个适配者类(Adaptee),该类包含了需要被适配的方法。
  3. 创建一个适配器类(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 的引用。在适配器中,通过调用被适应对象的方法来完成对目标接口方法的实现。

使用对象适配器方式可以使得客户端能够通过目标接口调用到被适应对象的方法,从而实现了两个不兼容接口之间的协同工作。

存在问题:

  1. 对象适配器方式需要额外创建一个适配器类和持有被适应对象的引用,可能会增加代码复杂性。
  2. 当需要同时继承多个父类时会受到Java单继承限制。

使用对象适配器方式可以较为灵活地将一个已有的类转换成满足客户端需求的新类型,并且可以支持对多个具体类进行适配。

接口适配器

实现原理:

  1. 定义目标接口(Target),该接口是客户端所期望的接口。
  2. 创建一个抽象适配器类(Adapter),该类实现了目标接口,并提供了默认的空方法实现,以便让子类选择性地覆盖需要的方法。
  3. 创建具体的适配器子类,继承自抽象适配器类,并根据需要重写其中的方法。
// 目标接口
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 方法。

使用接口适配器方式可以使得客户端能够选择性地实现目标接口中的方法,而不需要强制实现所有的方法。

存在问题:

  1. 接口适配器方式可能会导致类的层次结构变得复杂。
  2. 当需要同时继承多个父类时会受到Java单继承限制。

使用接口适配器方式可以提供更大的灵活性和可定制性,让客户端能够根据自身需求选择要实现的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/58182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 集成---Spark Streaming 框架集成

一.Spark Streaming 框架介绍 Spark Streaming 是 Spark core API 的扩展,支持实时数据流的处理,并且具有可扩展, 高吞吐量,容错的特点。 数据可以从许多来源获取,如 Kafka , Flume , Kin…

全景图像生成算法

摘要 全景图像生成是计算机视觉领域的一个重要研究方向。本文对五种经典的全景图像生成算法进行综述,包括基于相机运动估计的算法、基于特征匹配的算法、基于图像切割的算法、基于多项式拟合的算法和基于深度学习的算法。通过对这些算法的原理、优缺点、适用场景等…

【附源码】Axure RP Pro8.0安装教程|HTML|网页设计

软件下载 软件:Axure版本:8.0语言:简体中文大小:82.53M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨下载链接:https://pan.baidu.com/s/…

Springboot四种实现鉴权方式各自的优缺点

拦截器:拦截器是基于SpringMVC的一种机制,它可以在请求到达控制器之前或之后进行拦截和处理,比如验证用户身份,记录日志,添加响应头等。 优点:拦截器可以获取到请求的上下文信息,如请求路径&…

部署 ssm 项目到云服务器上(购买云服务器 + 操作远程云服务器 + 服务器中的环境搭建 + 部署项目到服务器)

部署 Web 项目 1、获取 Linux 环境1.1、如何去买一个云服务器1.2、远程操作云服务器1.3、在 Linux 系统中搭建 Java Web 的运行环境。1)安装 JDK(使用包管理器 yum 来安装)2) 安装Tomcat3)安装 MySQL。 1.4、在云服务器…

【力扣每日一题】2023.8.28 插入区间

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 和昨天的题大差不差,我们仍然是有一堆区间,题目给我们一个新的区间,要我们把新区间插入到原本的区间数…

腾讯云便宜购买指南(腾讯云怎样购买划算)

腾讯云是国内知名的云计算服务商,拥有广泛的应用和用户群体。对于有需要的用户来说,怎样便宜购买腾讯云产品是一个值得关注的问题,下面给大家分享腾讯云便宜购买指南。 腾讯云便宜购买指南:1、新用户专属礼包;2、老用户…

Postman —— postman实现参数化

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数每…

远程连接虚拟机中ubuntu报错:Network error:Connection refused

ping检测一下虚拟机 可以ping通,说明主机是没问题 #检查ssh是否安装: ps -e |grep ssh发现ssh没有安装 #安装openssh-server sudo apt-get install openssh-server#启动ssh service ssh startps -e |grep ssh检查一下防火墙 #防火墙状态查看 sudo ufw…

使用 Transformer 和 Amazon OpenSearch Service 构建基于列的语义搜索引擎

在数据湖中,对于数据清理和注释、架构匹配、数据发现和跨多个数据来源进行分析等许多操作,查找相似的列有着重要的应用。如果不能从多个不同的来源准确查找和分析数据,就会严重拉低效率,不论是数据科学家、医学研究人员、学者&…

智慧化工地SaaS平台源码,PC端+APP端+智慧数据可视化大屏端,源码完全开源不封装,自主研发,支持二开,项目使用,微服务+Java++vue+mysql

智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程…

es和数据库同步方案

5.5 课程信息索引同步 5.5.1 技术方案 通过向索引中添加课程信息最终实现了课程的搜索,我们发现课程信息是先保存在关系数据库中,而后再写入索引,这个过程是将关系数据中的数据同步到elasticsearch索引中的过程,可以简单成为索引…

C++类相关知识

鸽了好久,回来更新下吧 C类 类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量,函数称为成员函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为…

ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN

文章目录 ip_vs hook 后NF_INET_LOCAL_IN 本章重点: k8s 如何利用 ip_vs 实现源 IP 会话亲和性。 ip_vs hook 后 NF_INET_LOCAL_IN 根据优先级依次是 ip_vs_reply4,ip_vs_remote_request4 ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb&#xf…

免费API集合分享,赶紧收藏起来~

天气预警:支持输入经纬度或者区域编码,获取指定城市当前生效中的各类天气预警,如寒潮蓝色预警信号,或一次性拉取全国所有生效中的天气预警。 通知短信:当您需要快速通知用户时,通知短信是最快捷有效的方式…

Redis之发布订阅

一、Redis的发布订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频…

数据结构之哈希

哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 4. 哈希的应用4.1 位图4.2 布隆过滤器 哈希(Hash)是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式,也是一种常见的检索方…

Oracle数据库快速入门

前言: 我想现在很多人的入门数据库都是mysql,但是由于工作中会接触到Oracle数据库,如果你有MySQL的基础的话,这篇文章能让你很快掌握Oracle。 目录 1.体系结构 2.创建用户和表空间 2.1.创建表空间 2.2.创建用户 3.数据类型…

无涯教程-分类算法 - 简介

分类可以定义为根据观测值或给定数据点预测类别的过程。分类的输出可以采用"黑色"或"白色"或"垃圾邮件"或"非垃圾邮件"的形式。 在数学上,分类是从输入变量(X)到输出变量(Y)近似映射函数(f)的任务,它属于有监督…

MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

目录 1、DeepLab系列简介 1.1.DeepLabV1 1.1.1创新点: 1.1.2. 动机: 1.1.3. 应对策略: 1.2.DeepLabV2 1.2.1.创新点: 1.2.2.动机 1.2.3. 应对策略: 1.3.DeepLabV3 1.3.1创新点: 1.3.2. 动机&am…