Java设计模式-结构型设计模式-适配器模式

2023-11-18

Java设计模式-结构型设计模式-适配器模式

从这一专栏开始将学习设计模式,上课学习和自己总结归纳的笔记将总结出来供大家参考。
参考书籍:《设计模式就该这样学》

其他文章:

Java设计模式-UML类图 Java设计模式-七大架构设计原则-开闭原则
Java设计模式-七大架构设计原则-依赖倒置原则 Java设计模式-七大架构设计原则-单一职责原则
Java设计模式-七大架构设计原则-接口隔离原则 Java设计模式-七大架构设计原则-最少知道原则(迪米特法则)
Java设计模式-七大架构设计原则-里氏替换原则和合成复用原则 Java设计模式-创建型设计模式-简单工厂模式
Java设计模式-创建型设计模式-工厂方法模式(工厂模式) Java设计模式-创建型设计模式-抽象工厂模式
Java设计模式-创建型设计模式-建造者模式 Java设计模式-创建型设计模式-原型模式
Java设计模式-创建型设计模式-单例模式 Java设计模式-结构型设计模式-适配器模式
Java设计模式- 结构型设计模式-享元模式 Java设计模式- 结构型设计模式-外观模式
Java设计模式- 结构型设计模式-桥接模式 Java设计模式-结构型模式设计模式-组合模式
Java设计模式-行为型设计模式-观察者模式

一、结构型设计模式

在GOF23种设计模式中,有三种类型的设计模式,分别是:创建型设计模式、结构型设计模式、行为型设计模式

结构型设计模式有:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。

​ 类结构型模式:关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。

​ 对象结构型模式:关心类与对象的组合,通过关联关系,在一个类中定义另外一个类的实例对象,然后通过该对象调用相应的方法。

二、适配器模式

1.适配器模式定义

适配器模式(Adapter Pattern): 是作为两个不兼容的接口之间的桥梁,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

在GoF23种设计模式中属于结构型设计模式:

​ 其中包括:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。

2.适配器模式的角色

Client:用户类,使用目标接口,与和目标接口一致的对象合作。

Target:新的接口类,定义一个客户端使用的特定接口。

Adaptee:原有的类,即需要适配的类一个现存需要适配的接口。

Adapter:适配器类,负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。

3.适配器模式的特点

优点

可以让任何两个没有关联的类一起运行;
增加了类的透明性;
提高了类的复用度;
灵活性非常好。

缺点

过多使用适配器会使系统非常凌乱;
由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式。

4.适配器模式的类图

类适配器:

在这里插入图片描述

对象适配器:

在这里插入图片描述

5.适配器模式的代码实现

案例:
某公司要开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使汽车控制软件具有更好的灵活性和扩展性,现使用适配器模式设计该玩具汽车控制软件。

Target:CarController

Adaptee:PoliceSound、PoliceLamp

Adapter:PoliceCarAdapter

类图如下:

在这里插入图片描述

具体代码实现

1.CarController类,充当Target

/**
 汽车控制类,充当目标抽象类
 */
public abstract class CarController{
    public void move(){
        System.out.println("玩具汽车移动!");
    }
    public abstract void phonate();//发出声音
    public abstract void twinkle();//灯光闪烁
}

2.PoliceLamp,PoliceSound类,充当Adaptee

/**
 警灯类,充当适配者
 */
public class PoliceLamp{
    public void alarmLamp(){
        System.out.println("呈现警车警灯闪烁!");
    }
}
 
/**
 警笛类,充当适配者
 */
public class PoliceSound{
    public void alarmSound(){
        System.out.println("发出警车警笛声音!");
    }
}

3.PoliceCarAdapter类,充当Adapter

/**
 警车适配器,充当适配器。
 */
public class PoliceCarAdapter extends CarController{
    private PoliceSound sound;//定义适配者PoliceSound对象
    private PoliceLamp lamp;//定义适配者PoliceLamp对象
    public PoliceCarAdapter(){
        sound = new PoliceSound();
        lamp = new PoliceLamp();
    }
    //发出警笛声音
    public void phonate(){
        sound.alarmSound();//调用适配者类PoliceSound的方法
    }
    //呈现警灯闪烁
    public void twinkle(){
        lamp.alarmLamp();//调用适配者类PoliceLamp的方法
    }
}

4.Client(客户端测试类)

 */
public class Client {
    public static void main(String[] args) {
        CarController carController=new PoliceCarAdapter();
        carController.move();
        carController.phonate();
        carController.twinkle();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式-结构型设计模式-适配器模式 的相关文章

  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • #145 - Table 'xxxxx' is marked as crashed and should

    数据表损坏了 只需要修复一下就可以了 进入数据库 执行以下SQL REPAIR TABLE lt datastore
  • box-shadow 设置后看不到的问题

    引子 在修复问题的时候 发现一个元素设置了 box shadow 属性 其它的元素也有公用 但这个元素的阴影看不见 试着把颜色值变的更明显 但还是看不到 问题示例 示例二维码 Origin My GitHub 问题原因 首先想到是不是属性写
  • 12月份GitHub上最热门的Web开源项目

    在过去的一个月里 mybridge对将近200个Web开发开源项目排名 mybridge根据各种因素 对项目进行比较 并从中精选出前10位 上榜开源项目所获得Star数平均为 5550 1Quicklink https github com
  • Day.1 LeetCode刷题练习(最长公共前缀 C/C++两种解法)

    题目 例子 分析题目 主要目的 求出各个字符串的公共前缀 思路 本人解法 用所给实例来看 不难看出我们可以直接以竖着对应来查看是否是公共前缀 这样就有了一定的思路 然后接着想如何让他找到最长的公共前缀后就 停止下来呢 这样就能想到 从最短的
  • Win11共享打印机指定的网络名不可用?

    不知道大家在使用共享打印机的时候是否有遇到错误 共享打印机指定的网络名不可用 的情况 如果有的话 可以试试下面的解决办法 原因很明确 网络名称无法使用 有冲突 删除网络连接 重新建立即可 方法一 1 按键盘上的 Win X 组合键 或右键点
  • 审批流设计

    审批流系统 在日常企业中 经常涉及员工提交申请单 需要上级领导和多个节点审批通过 驳回 已完成申请单 实现目标 工单自定义模版 需支持用户自定义表单 拖拽式动态生成流转表单 打造低代码平台 降低了研发投入成本 提高整体人效 工单流程需支持用
  • element-ui el-upload 上传文件类型限制

    1
  • 双系统之删除Linux

    本文环境 win10 Ubuntu 先删除引导再操作卷 因为之前想学习Linux 所以就在win10上又安装了Ubuntu 现在不想搞了 再加上win10空间不太够用了 就想删除linux系统 话不多说 直接开始 删除Linux主要分为两部
  • 期望, 方差, 协方差,标准差

    期望 方差 协方差 标准差 期望 概率论中描述一个随机事件中的随机变量的平均值的大小可以用数学期望这个概念 数学期望的定义是实验中可能的结果的概率乘以其结果的总和 定义 设P x 是一个离散概率分布 自变量的取值范围为 x 1 x 2 x
  • 互联网+洗鞋店预约小程序新模式;

    互联网 洗鞋店预约小程序 1 线上线下业务的结合 传统的线下业务消费者到店可以向其推介线上的预约到家服务 让线下的消费者成为小程序内的会员 留存客户之后线上可直接触达 减少与消费者的距离 从等待客户到可以主动出击 有什么活动能第一时间推送到
  • WCF 自托管、无配置文件实现jsonp(跨域)的访问

    以下内容基于WCF4 0 本文将对比讨论配置文件方案和无配置文件方案的实现方式 WCF4 0加入了对RESTFU和标准终结点的支持 这为实现跨域提供了简单的方式 一 有配置文件的情况 首先我们先定义一个服务 ServiceContract
  • React styled-components (一) —— 基本使用

    https github com styled components styled components styled components 基本使用 介绍 优点 缺点 安装 引入 使用 基本用法 样式嵌套 介绍 styled compon
  • 三十六.用牛顿迭代法求输入的数的平方根

    欲求a的平方根 首先猜测一个值x1 a 2 也可以是随便其他什么值 作为其平方根 然后根据下面的迭代公式算出x2 再将x2代入公式右边算出x3 直到连续两次算出的xn和xn 1的差的绝对值小于某个值符号网名大全花样符号 即认为找到了足够精确
  • jQuery实现父窗口的问题

    因为先前遇到的问题 所以我考虑采用 IFRAME 来隔离不同的脚本 从而实现我需要的效果 在框架中 我用 JavaScript 获取 JSON 数据 组织成 HTML 代码 最后将其填充至上层文档的一个元素中 按照一般的写法 我们需要用到类
  • 微信接口开发报错invalid credential, access_token is invalid or not latest hint

    微信接口凭证access token一定要全局管理 我们的查酒后台集成了微信公众平台的客服API接口 不用登录微信公众号的后台就可以直接给用户发送消息 最近 运营的同事反馈 通过微信查酒 后台无法直接给用户推送微信消息了 起初 我也没在意
  • 揭秘:WhatsApp的注册策略

    WhatsApp账号的注册方式可以分为两种 实体卡注册和虚拟卡注册 实体卡注册是指使用个人手机卡完成注册 而虚拟卡注册则通过前面提到的对接平台来完成的 账号注册问题一直是导致WhatsApp账号永久封禁的主要原因 由于WhatsApp广泛为
  • HTML5口红西瓜见缝插针小游戏代码

    下载地址 口红西瓜HTML5见缝插针手机游戏代码 口红西瓜见缝插针手机游戏源代码 dd
  • Windows11如何正确修改电脑用户名——解决修改用户名之后无法找到文件路径,路径不存在问题——用Registry Workshop批量操作注册表

    c users 后面是中文会有什么影响 很多人在刚拿到电脑的时候 注册用户名的时候直接填的中文 对一名程序员来说 用户名是中文 有时候在程序运行的过程中会产生非常多的麻烦 解决办法 想要了解第三点的命令的可以看这里http t csdn c
  • RocketMQ-源码解读与调试

    源码环境搭建 源码拉取 RocketMQ的官方Git仓库地址 GitHub apache rocketmq Mirror of Apache RocketMQ 可以用git把项目clone下来或者直接下载代码包 也可以到RocketMQ的官
  • Java设计模式-结构型设计模式-适配器模式

    Java设计模式 结构型设计模式 适配器模式 从这一专栏开始将学习设计模式 上课学习和自己总结归纳的笔记将总结出来供大家参考 参考书籍 设计模式就该这样学 其他文章 Java设计模式 UML类图 Java设计模式 七大架构设计原则 开闭原则