【设计模式-3.2】结构型——适配器模式

说明:本文介绍设计模式中结构型设计模式中的,适配器模式;

插头转换器

适配器模式属于结构型设计模式,设计思想体现在结构上的。以插头转换器为例,当你需要给手机充电,但是眼前只有一个三孔插座,二脚充电器无法使用三孔插座。

这时如果有一个插头转换器,可以将二孔插头转为三脚插头,就可以解决眼前问题。这个转换器扮演的就是适配器的角色。如下:

(TwoPin,二脚插座接口,只提供二脚插头充电)

/*** 二脚插座*/
public interface TwoPin {/*** 二脚充电*/public void charge(int l, int r);
}

(ThreePin,三脚插座接口,只提供三脚插头充电)

/*** 三脚插座*/
public interface ThreePin {/*** 三脚充电*/public void charge(int l, int r, int g);
}

(Phone,手机,充电器属于二脚插头)

/*** 手机*/
public class Phone implements TwoPin{@Overridepublic void charge(int l, int r) {System.out.println("手机充电中..." + l + "====" + r);}
}

(客户端类,演示手机充电过程,二孔插头无法插入三孔插座,类型错误)

在这里插入图片描述

为了解决上面问题,我们可以创建一个适配器类,用来适配手机类使用三孔插座,如下:

/*** 适配器*/
public class Adapter implements ThreePin{/*** 适配器持有手机对象*/private Phone phone;/*** 适配手机使用三脚插座* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {phone.charge(l, r);}
}

(Client,客户端,演示手机使用三脚插座)

/*** 客户端*/
public class Client {public static void main(String[] args) {// 借助适配器,手机使用三脚插座充电Phone phone = new Phone();new Adapter(phone).charge(1, 1, 0);}
}

借助适配器,手机就可以使用三脚插座了;

在这里插入图片描述

专属适配器

当我们想让该适配器专属于手机,而不给其他类使用时,我们可以通过继承的方式来实现。

如下:

(Phone,手机类,给手机一个name属性,表示手机的名称)

/*** 手机*/
public class Phone implements TwoPin{/*** 手机名称*/protected String name;public Phone(String name) {this.name = name;}@Overridepublic void charge(int l, int r) {System.out.println(name + ":手机充电中..." + l + "====" + r);}
}

(PhoneAdapter,手机专属适配器,继承于手机,实现三脚插座接口)

/*** 手机专属适配器*/
public class PhoneAdapter extends Phone implements ThreePin{/*** 适配器持有手机对象*/private Phone phone;public PhoneAdapter(Phone phone) {super(phone.name);this.phone = phone;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":在使用专属的适配器给手机充电...");super.charge(l, r);}

(Client,客户端,演示小米手机使用手机专属的适配器,用三孔插座充电)

/*** 客户端*/
public class Client {public static void main(String[] args) {// 小米手机使用手机专属的适配器,用三孔插座充电Phone phone = new Phone("小米手机");new PhoneAdapter(phone).charge(1, 1, 0);}
}

在这里插入图片描述

双向适配器

双向适配器,就是该适配器对二孔插头、三孔插头的充电器都可以适配,如下:

在这里插入图片描述

代码实现如下:

(MultipleAdapter,多重适配器,实现两个接口,注入两个对象,创建对应的两个构造方法)

/*** 多重适配器*/
public class MultipleAdapter implements ThreePin, TwoPin{/*** 三孔插座*/private ThreePin threePin;/*** 二孔插座*/private TwoPin twoPin;public MultipleAdapter(ThreePin threePin) {this.threePin = threePin;}public MultipleAdapter(TwoPin twoPin) {this.twoPin = twoPin;}/*** 三孔插座充电* @param l* @param r* @param g*/@Overridepublic void charge(int l, int r, int g) {this.twoPin.charge(l, r);}/*** 二孔插座充电* @param l* @param r*/@Overridepublic void charge(int l, int r) {this.threePin.charge(l, r, 0);}
}

(Computer,创建一个电脑类,使用三孔插座的)

/*** 电脑*/
public class Computer implements ThreePin{/*** 电脑名称*/protected String name;public Computer(String name) {this.name = name;}@Overridepublic void charge(int l, int r, int g) {System.out.println(name + ":充电中..." + l + "====" + r + "====" + g);}
}

(Client,客户端,演示手机、电脑使用多重适配器给手机充电)

/*** 客户端*/
public class Client {public static void main(String[] args) {// 电脑使用多重适配器,用二孔插座充电Computer computer = new Computer("联想电脑");new MultipleAdapter(computer).charge(1,1);// 手机使用多重适配器,用三孔插座充电Phone phone = new Phone("小米手机");new MultipleAdapter(phone).charge(1,1,0);}
}

(不论是二孔插头还是三孔插头,都行)

在这里插入图片描述

以上就是适配器模式的内容,适配的思想还是非常常见的,在Java中,方法重载不正是适配器模式在方法上的一种体现吗?而适配器模式,是在类的层面上,对多种类、对象之间的一种适配。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书

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

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

相关文章

Java基本类型的高级使用方法详解

引言 Java中的基本数据类型(primitive types)是构建程序的基础,包括整型、浮点型、字符型、布尔型等。除了直接使用这些基本类型外,Java还提供了一些高级的使用方法,使得我们能够更灵活地处理基本类型数据。本文将深入…

二叉树结点个数、叶子结点个数、树的高度、第k层结点个数的计算(C语言)

目录 前言 分治算法 模拟二叉树代码 结点个数计算 错误方法 不便利方法 基于分治思想的方法 叶子结点个数 树的高度 第k层结点的个数 前言 在链式二叉树的前序、中序、后续遍历中我们模拟了一棵二叉树,并实现了它的前、中、后序遍历,现在我们来…

UE4 .ini文件使用

在需要给配置文件的类中加上config标签,当然变量也要加 在项目的Config下,新建一个Default类的UCLASS中config等于的名字,这里结合上面截图就是DefaultTest 在下面写入 [/Script/项目名/类名] 然后写变量以及对应的值即可

【Angular 开发】Angular 信号的应用状态管理

自我介绍 做一个简单介绍,年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【架构…

智能机器人在新材料方面遇到的挑战

智能机器人在新材料方面面临的挑战包括但不限于以下几点: 新材料的研发:机器人需要使用新材料来提高其性能和功能。然而,新材料的研发需要大量的时间和资金,同时还需要具备高超的技术和专业知识. 材料的可靠性:机器人…

GO面试题系列

1.GO有哪些关键字 2.GO有哪些数据类型 3.Go方法与函数的区别 在Go语言中,方法和函数是两个不同的概念,尽管它们在某些方面有相似之处。下面是它们的主要区别: 定义位置: 函数: 函数是独立声明的,它们不…

python数据分析总结(pandas)

目录 前言 df导入数据 df基本增删改查 数据清洗 ​编辑 索引操作 数据统计 行列操作 ​编辑 df->types 数据格式化 ​编辑 日期数据处理 前言 此篇文章为个人python数据分析学习总结,总结内容大都为表格和结构图方式,仅供参考。 df导入数…

Vue3使用vue-baidu-map-3x百度地图

安装vue-baidu-map-3x: // vue3 $ npm install vue-baidu-map-3x --save// vue2 $ npm install vue2-baidu-map --save 全局注册/局部注册: import { createApp } from vue import App from ./App.vue import BaiduMap from vue-baidu-map-3xconst app …

综述 2017-Genome Biology:Alignment-free sequence comparison

Zielezinski, Andrzej, et al. "Alignment-free sequence comparison: benefits, applications, and tools." Genome biology 18 (2017): 1-17. https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1319-7 被引次数:476应用问题&…

curl 18 HTTP/2 stream

cd /Users/haijunyan/Desktop/CustomKit/KeepThreadAlive/KeepThreadAlive //Podfile所在文件夹 git config --global https.postBuffer 10485760000 git config --global http.postBuffer 10485760000 pod install https://blog.csdn.net/weixin_41872403/article/details/86…

linux命令积累

1.查找指定目录下第二层目录,一年前的文件 find $dir -maxdepth 1 -type d -mtime 365 2./data/att/dir1软连接到/data1/att/dir1 硬连接和软连接的区别 硬连接 ln file1 file2 1.硬连接不能对目录进行链接。 2.硬连接修改一个文件(不论修改哪方文件&…

top K问题(借你五分钟)

目录 前言 top K问题 模拟数据 建堆 验证(简单了解即可) 最终代码 调试部分 前言 在大小堆的实现(C语言)中我们讨论了堆的实际意义,在看了就会的堆排序(C语言)中我们完成了堆排序&#…

银河麒麟本地软件源配置方法

软件源介绍 软件源可以理解为软件仓库,当需要安装软件时则会根据源配置去相应的软件源下载软件包,此方法的优点是可以自动解决软件包的依赖关系。常见的软件源有光盘源、硬盘源、FTP源、HTTP源,本文档主要介绍本地软件源的配置方法&#xff…

功能强大的屏幕录制和剪辑工具Camtasia Studio 2024 中文版

Camtasia Studio 2024 是一款功能强大的屏幕录像工具,集视频录制、剪辑、编辑和播放于一体的多功能屏幕录制软件,Camtasia Studio 2024操作简单,它能够轻松为您将屏幕上的所有声音、影音、鼠标移动的轨迹和麦克风声音全部录制下来&#xff0c…

分布式架构原理与实践读书笔记

分布式架构原理与实践读书笔记 IT 软件架构的更迭:从单体架构,到集群架构,到现在的分布式和微服务架构。 分布式架构具有分布性、自治性、并行性、全局性等特点。 为了应对请求的高并发和业务的复杂性,需要对应用服务进行合理拆…

springboot(ssm畅游游戏销售平台 游戏电商系统Java系统

springboot(ssm畅游游戏销售平台 游戏电商系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) 数…

使用Jmeter做性能测试的注意点

一、性能测试注意点 1. 用jmeter测试时使用BeanShell脚本获取随机参数值,会导致请求时间过长,TPS过低。应改为使用csv读取参数值,记录的TPS会更加准确。 注:进行性能测试时,应注意会影响请求时间的操作,尽量…

[JVM 基础 - Java 类加载机制]

这篇文章将带你深入理解Java 类加载机制。 JVM 基础 - Java 类加载机制 类的生命周期 类的加载: 查找并加载类的二进制数据连接 验证: 确保被加载的类的正确性准备: 为类的静态变量分配内存,并将其初始化为默认值解析: 把类中的符号引用转换为直接引用初始化使用卸…

1-4、JDK目录结构

语雀原文链接 文章目录 1、目录结构2、JDK中rt.jar、tools.jar和dt.jar作用3、bin目录部分说明(基本工具) 1、目录结构 bin目录:包含一些用于开发Java程序的工具,例如:编译工具(javac.exe)、运行工具 (java.exe) 、打…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句,但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件,loop body是循环体。 当循环条件成立时,…