设计模式之结构型模式:适配器模式

news2024/11/26 2:31:30

前言

前面讲解完了设计模式中的创建性模式,本文开始讲解设计模式中的结构性模式之一:适配器模式。

一、适配器模式的是干什么的?

A类想要使用B类中的某些方法,但是不能直接使用,需要一个中间类对B类进行处理后,A类才能使用,这个中间类就是适配器,这种模式就是适配器模式。示意图如下。
在这里插入图片描述
既A类和B类之间夹了一个适配器类,适配器将B类传入的数据src进行处理,然后输出为A类需要使用的dst传给A类。

按照适配器如何接收B类的方式,将适配器模式分为三种模式,如果适配器类通过继承B类获得B类行为,则称为类适配器模式;如果直接将B类对象聚合到适配器类中,称为对象适配器模式;如果以接口的形式给到适配器类,则称之为接口适配器。

二、适配器模式案例

如我们有一个Voltage220v类只能输出220v的电压,但是现在我们要给手机充电,只能使用5V的电压,那么此时就需要一个适配器类VoltageAdapter首先将220v的电压转为5v,然后再给手机使用。三种适配器模式的实现如下:

1. 类适配器模式实现

在这里插入图片描述

  1. UML图如上所示,VoltageAdapter继承Voltage220v并实现IVoltage5v接口,然后手机再使用VoltageAdapter中输出的5V电压进行充电。
  2. 具体实现代码如下
public class Voltage220v {
    public int output200v()
    {
        return 220;
    }
}


public interface IVoltage5v {
    public int output5v();
}

public class VoltageAdapter extends Voltage220v implements IVoltage5v{
    @Override
    public int output5v() {
        int src = output200v();
        int dis = src / 44;
        return dis;
    }
}

public class Phone {
    public void charging(IVoltage5v iVoltage5v)
    {
        if (iVoltage5v.output5v() == 5)
        {
            System.out.printf("可以充电");
        }
        else
        {
            System.out.printf("不能充电");
        }
    }

}

public class client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        IVoltage5v iVoltage5v = new VoltageAdapter();
        phone.charging(iVoltage5v);
    }
}

2. 对象适配器模式实现

在这里插入图片描述

  1. 对象适配器UML图如上所示,与类适配器模式的区别就是对象适配器直接将Voltage220v对象聚合到了VoltageAdapter中,其余和类适配器模式思想一样。

3. 接口适配器模式实现

接口适配器核心思想是通过一个抽象类继承接口,并对所有的接口方法做默认空实现,那么该抽象类的子类就可以有选择的覆盖父类中的某些方法,而不必覆盖全部方法。
在这里插入图片描述

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

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

相关文章

C++的类型转换

目录C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不…

【Linux】第七部分 Linux中系统管理

【Linux】第七部分 Linux中系统管理 文章目录【Linux】第七部分 Linux中系统管理7. Linux中系统管理7.1 进程和服务7.2 service 服务管理systemctl 基本语法systemctl设置后台服务的自启动配置关机重启命令总结7. Linux中系统管理 7.1 进程和服务 一个正在执行的程序或命令&a…

2023年快到了,就简单用python写个对联吧

人生苦短 我用python 我知道现在离过年还早~ 但是早点准备早点轻松~ Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联、横批,然后自动生成春联保存在代码文件夹,如果…

梦想SkyPython IDLE入门

IDLE是Python软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试Python程序。 一、IDLE的安装 实际上,IDLE是跟Python一起安装的,不过要确保安装时选中了“Tcl/Tk”组件,准确地说,应该是不要…

六、应用层(一)网络应用模型

目录 1.1 客户/服务器模型 1.2 P2P模型 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登陆、文件传输、新闻组)20世纪90年代将…

node.js+uni计算机毕设项目基于微信小程序的培训机构管理系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

六、应用层(二)域名系统(DNS)

目录 2.1层次域名空间 2.2域名服务器 2.3域名解析过程 域名系统(Domain Name System,DNS)是因特网使用的命名系统,用来把便于人们记忆的具有特定含义的主机名转换为便于机器处理的IP地址。 多台主机可以映射到同一个域名上(如负…

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 通过Python基于YOLOv7深度学习网络对现场画面实时监测分析。当识别到现场车辆冲洗不干净或者没有冲洗,系统就立即抓拍。与C / C等语言相比,Python速度较慢。也就是说,Python可以使用C / C轻松…

SpringCloud图文详解 | 两种注册中心远程调用负载均衡服务网关... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘SpringCloud,顺便上传笔记。 下图是我总结的 SpringCloud 知识的初级思维导图,后续会不断补充 文章目录微服务技术演变单体架构分布式架构微服务 - 特点微服务实现 - 技术对比微服务技术 - 实际应用SpringCloud知识点总结服务拆分和…

SSM框架学习记录-SpringMVC_day02

1.SSM整合 代码参考Springmvc_08_ssm 流程分析 添加依赖:pom.xml编写配置类: Spring的配置类SpringConfig.javaSpringMVC的配置类SpringMvcConfig.javaWeb项目的入口配置类ServletConfig.javaMyBatis的配置类MyBatisConfig.java第三方数据源的配置类Jdbc…

uniapp动态切换显示不同内容组件

需求描述 通过点击注册或是登录按钮切换不同的组件.默认显示登陆界面,登录字样加粗显示,登录页面显示手机号密码登录.点击注册切换到注册页面,注册字样加粗显示,页面显示手机号和验证码以及注册按钮.对应页面显示如下: 实现代码: <template><view class"conte…

pytorch实战(五)——时间序列多步预测的五种方法介绍

当需要根据已有的时间序列数据&#xff0c;预测未来多个时刻的状态时&#xff0c;被称之为时间序列多步预测。 时间序列多步预测有五种策略&#xff0c;分别为&#xff1a; 1、直接多步预测&#xff08;Direct Multi-step Forecast&#xff09; 2、递归多步预测&#xff08;Rec…

Redis5.0+——主从复制

说明 主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff08;一主一从&#xff0c;一主多从&#xff09; 能实现目的 读写分离&#xff0c;性能拓展容灾区快速恢复&#xff08;当一个从…

【软件测试】资深测试的总结,接口测试中的最常见的几个错误......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 为了彻底进行API接口…

入门力扣自学笔记221 C++ (题目编号:1739)

1739. 放置盒子 题目&#xff1a; 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y…

工作流运行

工作流运行 定义内涵 工作流运行是工作流模板的依次执行&#xff0c;在工作流运行时&#xff0c;用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同&#xff0c;运行过程中可能会产生不同的新资源&#xff0c;如数据 处理类型的工作流会产生新的数据集&…

DJ15 8086 中断程序设计

目录 一、8086/8088 中断系统 1. 8086/8088 中断源类型 2. 中断向量表 3. CPU 中断类型码的获取方法 二、8259A 的引线及内部结构 1. 外部引线 2. 内部结构 3. 与系统总线的连接方式 4. 级联连接方式 5. 中断触发方式 三、8259A 的工作过程 四、8259A 的工作方式 …

K. The Robot(思维 + 看数据范围)

Problem - 1468K - Codeforces 有一个机器人在一个格子场上&#xff0c;这个格子场在各个方向都是无尽的。最初&#xff0c;机器人位于坐标为(0,0)的单元中。他将执行由一串大写拉丁字母 "L"、"R"、"D"、"U "描述的命令。当一个命令被…

使用凸优化来调整基于毫米波的无线通信参数(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着通信产业尤其是个人移动通信的高速发展&#xff0c;无线电频谱的低端频率已趋饱和&#xff0c;即使是采用高斯滤波最小频移…

CentOS7安装runc

CentOS7安装runc前言一、runc简介二、安装runc1.安装 libseccomp-dev2.获取runc源代码2.1先创建 $GOPATH/src/github.com 目录2.2go get下载源代码2.3checkout最新的代码2.4编译并安装runc2.5查看runc版本总结前言 本文记录CentOS7安装runc的过程。 一、runc简介 RunC 是一个…