Java设计模式——适配器模式

2023-10-30

介绍适配器模式

适配器主要用于接口的转换或者将接口不兼容的类对象组合在一起形成对外统一接口,是一种结构性模式,其本质是是一个中间件,适用于类及其对象。

原理:通过继承来实现适配器功能

介绍
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何解决:继承或依赖(推荐)。

关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题

类适配器模式

在这里插入图片描述

  • 定义目标接口类:Target
public interface Target {
    void request();
}
  • 被适配的类:Adaptee
public class Adaptee {
    public void adapteeRequest() {
        System.out.println("adapteeRequest method of Adaptee! ");
    }
}
  • 适配类Adapter,继承Target的接口request,同时继承Adaptee的实现adapteeRequest
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        // TODO Auto-generated method stub
        super.adapteeRequest();
    }
}
  • 演示(Client):
public class Demo {
    public static void main(String [] args) {
        Target target = new Adapter();
        target.request(); // result: adapteeRequest method of Adaptee! 
    }
}

对象的适配器模式

在这里插入图片描述
从上面两张UML图中可以清楚的看出两者的区别,对象中Adapter不在继承Adaptee,而是将Adaptee作为一个数据成员组合到类定义中,从而实现对其接口的访问。

public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();
    @Override
    public void request() {
        // TODO Auto-generated method stub
        adaptee.adapteeRequest();
    }
}

接口的适配器模式

不做赘述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式——适配器模式 的相关文章

  • div页面垂直居中方法方法

    基本思路 1 首们需要position absolute 绝对定位 而层的定位点 使用外补丁margin负值的方法 负值的大小为层自身宽度高度除以二 例子 一个层宽度是400 高度是300 使用绝对定位距离上部与左部都设置成50 而marg
  • 带你详细了解ADSS光缆

    ADSS 全介质自承式光缆 光缆是一种自支撑架空光缆 专为架空安装和部署而设计 适用于各种户外应用 本文将提供ADSS光缆的一些知识 什么是ADSS光缆 ADSS 光缆是一种光缆 其强度足以在结构之间支撑自身 而无需使用导电金属元件 该光缆
  • 创建qml自定义视频源(Qt5.15.2+设备帧)

    前言 若是看过笔者之前的文档 应该会注意到 笔者显示自定义视频 使用的是QQuickImageProvider和Image类型实现 本次笔者记录另一种显示方式 创建视频源 然后使用VideoOutput显示 因为Qt5和Qt6多媒体模块发生
  • QML自定义模块及qmldir的使用

    前言 在开发QtQuick项目中 当项目文件很多的情况下 可能会分成多级文件夹来进行分类 还有一些通用类型文件 如公共组件 通用配置等等 需要在各个不同的文件中进行调用 这种情况下 一种方式是在当前需要引用的文件中通过关键字import 加
  • TCP-三次握手

    文章目录 三次握手 简单示意图 详细分析 一些思考 为什么是三次握手 SYN 攻击 什么是SYN 攻击 如何防止SYN 攻击 数据包丢失了该怎么办 初始序列号为什么随机产生 为什么 SYN 段不携带数据却要消耗一个序列号呢 每次握手可以确定

随机推荐

  • 数据库驱动和数据库连接(MySQL)

    数据库驱动和数据库连接 MySQL 一 数据库驱动 什么是数据库驱动 二 数据库连接 jdbc连接的方式以及区别 1 通过DriverManager 驱动管理类 的静态方法获取 2 通过DataSource 数据源 对象获取 3 两种创建连
  • SpringBoot常用注解和原理简介说明

    转自 SpringBoot常用注解和原理简介说明 下文笔者讲述SpringBoot常见注解的简介说明 如下所示 启动注解 SpringBootApplication Target ElementType TYPE Retention Ret
  • C++——QT之信号与槽

    通俗的理解信号与槽 信号与槽 Signal Slot 是 Qt 编程的基础 也是 Qt 的一大创新 因为有了信号与槽的编程机制 在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单 信号 Signal 就是在特定情况下被发射的事件 例
  • 设计模式:快照模式

    快照模式也叫做备忘录模式 但是我觉得如果是了解快照的话 我觉得比备忘录更形象一点 毕竟现在快照有各种 有页面快照 有系统快照等 相当于是一个备份 备忘录其实也是备份的意思 我觉得快照更贴切一点现在的描述 快照模式是一种行为模式 行为模式可以
  • Python利用Opencv读取图片

    首先 要先确认PyCharm里面有没有装opencv python 如果没有 点右侧 号搜索添加 确认有opencv之后 便可以使用cv2读取图片了 import cv2 image path C Desktop image jpg 图片路
  • 数字化时代-23:中国人工智能企业100强排行榜

    综合实力TOP100 成长能力TOP100 创新能力TOP100
  • React组件卸载、路由跳转、页面关闭(刷新)之前进行提示

    React组件卸载生命周期 路由跳转和页面关闭三者看起来有些类似的地方 比如都是当前组件即将从视口消失 但实际上所触发的事件均不相同 以一个实际案例出发 某单页应用的 文章编辑页用户正在编辑文章 此时尚未保存 当用户不小心要跳转到另外一个路
  • SpringBoot——内置数据源

    简单介绍 在之前我们介绍SpringBoot的数据层解决方案的时候 曾说到过在数据层是由数据源 持久化技术和数据库组成的 之前我们一直使用的都是Druid MyBatis MySQL组合的解决方案 这三种方案在之前我们都介绍过如何整合以及基
  • 进阶:变量 1.系统变量 说明:变量由系统定义,不是用户定义,属于服务器层面。 注意:(1) 全局变量需要添加global关键字 (2) 会话变量需要添加session键字 (3)

    进阶 变量 1 系统变量 说明 变量由系统定义 不是用户定义 属于服务器层面 注意 1 全局变量需要添加global关键字 2 会话变量需要添加session关键字 3 如果不写 默认session会话级别 使用步骤 1 查看所有系统变量
  • 大话西游2人数最多服务器,大话2大话各个服务器狂人榜排名 看大话如今服务器...

    大话2大话各个服务器狂人榜排名 看大话如今服务器 给大家带来各个服务器的练功排行等等 以下图均为服务器练功排行榜目前前三名 有些错误之处还望指正 冠希会及时修改 大话精灵有时候也问不到了 52 根据以下数据分析得出 1 目前超过3年以上没合
  • DM@数理逻辑@命题和联结词@形式化命题

    文章目录 abstract 命题和联结词基本概念 命题 陈述句 命题真值 真假记号 原子命题 命题分解 复合命题 联结词命题 例 半形式化命题和形式化语言 形式逻辑的抽象性 联结词形式化 否定 合取 析取 相容或的表示 排斥或的表示 蕴含
  • GPIO八种工作模式

    GPIO8种工作模式 一 输出模式 1 推挽输出 Out PP 推挽输出模式下 单片机输出高电平直接接到VDD 3 3V 输出低电平直接接到VSS 0V 具有强的驱动能力 2 开漏输出 Out OD 开漏输出模式下 单片机输出低电平也是接到
  • yolov5在plotting labels时停止并显示Process finished with exit code 1

    最近在训练yolov5模型 但在执行train py时 执行到plotting labels停止 显示错误 解决办法 报错信息里traceback里第二行 把这个注释掉就可以进入训练了
  • 用好GPT关键诀窍之上下文学习

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • Spring AOP无法调用自身方法的原因

    this是当前对象 调用当前对象因为不是从IOC托管对象中 获取所以自然也是不能被AOP捕获 所有AOP的必须用代理对象执行 在同一个类中使用 Transaction Async并不能实现事务和异步 道理就是这样的 新建一个类 Compon
  • 深圳大学第三期“飞鹰计划”正式开班

    金秋九月 丹桂飘香 在这个充满着收获的季节里 迎来了期待已久的深圳大学机电与控制工程学院飞鹰计划2022级第三期开班典礼 受疫情影响 虽然典礼只能在线上举行 但是丝毫不影响电巢专家及学生们的热情 9月17日下午 百余位同学通过线上参加了此次
  • uCOS-II信号量OSSemCreate(0)和OSSemCreate(1)详解

    在ucos II中 为了实现任务之间的同步 用到的同步机制有 信号量 邮箱和消息队列 其中这里我主要说下对信号量的使用经验 信号量在创建时 调用OSSemCreate INT16U cnt 函数 cnt为信号量的初始值 对cnt赋予不同的值
  • Mac OS无法进入系统/数据备份/重装系统方法步骤

    之前我的Mac Mini不知为什么突然间不能进入到系统了 开机的时候基本都时进度条走到2 3的时候就会自动死机 打电话给客户 客服是不错 TM殊不知 聊了N就之后 发现这是要话费的 NM足足磨了1个多小时也没能解决我的问题 好吧 苹果系统时
  • Service Pack 6 for Visual Basic 6.0, Visual C++ 6.0 with Visual Source Safe 6.0d下载

    下载VC6 0的SP6补丁 网址http www microsoft com en us download details aspx id 9183 补充 英文版 http download microsoft com download 1
  • Java设计模式——适配器模式

    文章目录 介绍适配器模式 类适配器模式 对象的适配器模式 接口的适配器模式 介绍适配器模式 适配器主要用于接口的转换或者将接口不兼容的类对象组合在一起形成对外统一接口 是一种结构性模式 其本质是是一个中间件 适用于类及其对象 原理 通过继承