适配器模式和装饰器模式

文章目录

  • 适配器模式
    • 1.引出适配器模式
        • 1.多功能转换插头
        • 2.基本介绍
        • 3.工作原理
    • 2.类适配器
        • 1.基本介绍
        • 2.类图
        • 3.代码实现
          • 1.Voltage220V.java
          • 2.Voltage5V.java
          • 3.VoltageAdapter.java
          • 4.Phone.java
          • 5.Client.java
          • 6.结果
        • 4.类适配器的注意事项
    • 3.对象适配器
        • 1.基本介绍
        • 2.使用对象适配器改进类适配器
          • 1.类图
          • 2.介绍
        • 3.代码实现
          • 1.修改VoltageAdapter.java 构造器聚合被适配的对象
          • 2.修改Client.java 传入被适配的对象
    • 4.接口适配器模式
        • 1.基本介绍
        • 2.类图
        • 3.目录结构
        • 4.代码实现
          • 1.Interface.java
          • 2.AbsAdapter.java
          • 3.ClassA.java
          • 4.结果
  • 适配器模式
    • 1.引出适配器模式
        • 1.多功能转换插头
        • 2.基本介绍
        • 3.工作原理
    • 2.类适配器
        • 1.基本介绍
        • 2.类图
        • 3.代码实现
          • 1.Voltage220V.java
          • 2.Voltage5V.java
          • 3.VoltageAdapter.java
          • 4.Phone.java
          • 5.Client.java
          • 6.结果
        • 4.类适配器的注意事项
    • 3.对象适配器
        • 1.基本介绍
        • 2.使用对象适配器改进类适配器
          • 1.类图
          • 2.介绍
        • 3.代码实现
          • 1.修改VoltageAdapter.java 构造器聚合被适配的对象
          • 2.修改Client.java 传入被适配的对象
    • 4.接口适配器模式
        • 1.基本介绍
        • 2.类图
        • 3.目录结构
        • 4.代码实现
          • 1.Interface.java
          • 2.AbsAdapter.java
          • 3.ClassA.java
          • 4.结果

适配器模式

1.引出适配器模式

1.多功能转换插头

image-20240529203251649

2.基本介绍

image-20240529203509980

3.工作原理

image-20240529203741032

2.类适配器

1.基本介绍

image-20240529203956891

2.类图

image-20240529205154428

3.代码实现
1.Voltage220V.java
package com.sun.classadapter;/*** Description: 被适配者* @Author sun* @Create 2024/5/29 20:53* @Version 1.0*/
public class Voltage220V {public int output220V() {int src = 220;System.out.println("电压输出为" + src + "伏");return src;}
}
2.Voltage5V.java
package com.sun.classadapter;/*** Description: 适配器的接口* @Author sun* @Create 2024/5/29 20:56* @Version 1.0*/
public interface Voltage5V {// 用于将5V的电压适配到220Vpublic int output5V();
}
3.VoltageAdapter.java
package com.sun.classadapter;/*** Description: 适配器* @Author sun* @Create 2024/5/29 20:58* @Version 1.0*/
public class VoltageAdapter extends Voltage220V implements Voltage5V{@Overridepublic int output5V() {// 将220V的电压适配到5Vint srcV = super.output220V();int disV = srcV / 44;return disV;}
}
4.Phone.java
package com.sun.classadapter;/*** Description: 使用者* @Author sun* @Create 2024/5/29 21:00* @Version 1.0*/
public class Phone {// 依赖一个适配器进行充电public void charging(Voltage5V voltage5V) {if (voltage5V.output5V() == 5) {System.out.println("电压为5V,适配成功,可以开始充电");} else {System.out.println("电压不为5V,无法充电!");}}
}
5.Client.java
package com.sun.classadapter;/*** Description:* @Author sun* @Create 2024/5/29 21:03* @Version 1.0*/
public class Client {public static void main(String[] args) {Phone phone = new Phone();// 给手机装配一个5V的适配器进行充电phone.charging(new VoltageAdapter());}
}
6.结果

image-20240529211353436

4.类适配器的注意事项

image-20240529211706653

3.对象适配器

1.基本介绍

image-20240529211827759

2.使用对象适配器改进类适配器
1.类图

image-20240529212625622

2.介绍

image-20240529212038831

3.代码实现
1.修改VoltageAdapter.java 构造器聚合被适配的对象
package com.sun.objectadapter;/*** Description: 适配器* @Author sun* @Create 2024/5/29 20:58* @Version 1.0*/
public class VoltageAdapter implements Voltage5V {private Voltage220V voltage220V;// 使用构造器聚合被适配的对象public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 将220V的电压适配到5Vint disV = 0;if (voltage220V != null) {int srcV = voltage220V.output220V();disV = srcV / 44;}return disV;}
}
2.修改Client.java 传入被适配的对象
package com.sun.objectadapter;/*** Description:* @Author sun* @Create 2024/5/29 21:03* @Version 1.0*/
public class Client {public static void main(String[] args) {Phone phone = new Phone();// 给手机装配一个5V的适配器进行充电phone.charging(new VoltageAdapter(new Voltage220V()));}
}

4.接口适配器模式

1.基本介绍

image-20240531194529065

2.类图

image-20240531195619680

3.目录结构

image-20240531200449553

4.代码实现
1.Interface.java
package com.sun.interfaceadapter;/*** Description: 一个接口有四个方法,但是普通的类不想全部实现* @Author sun* @Create 2024/5/31 19:57* @Version 1.0*/
public interface Interface {public void m1();public void m2();public void m3();public void m4();
}
2.AbsAdapter.java
package com.sun.interfaceadapter;/*** Description:* @Author sun* @Create 2024/5/31 19:58* @Version 1.0*/
public abstract class AbsAdapter implements Interface{@Overridepublic void m4() {}@Overridepublic void m3() {}@Overridepublic void m2() {}@Overridepublic void m1() {}
}
3.ClassA.java
package com.sun.interfaceadapter;/*** Description: 普通的类重写抽象类的方法* @Author sun* @Create 2024/5/31 19:59* @Version 1.0*/
public class ClassA {public static void main(String[] args) {// 如果想要使用接口的某个方法,就直接使用匿名内部类继承抽象类,重写其中的方法AbsAdapter absAdapter = new AbsAdapter() {@Overridepublic void m1() {System.out.println("重写了m1方法");}};absAdapter.m1();}
}
4.结果

image-20240531200605292

适配器模式

1.引出适配器模式

1.多功能转换插头

image-20240529203251649

2.基本介绍

image-20240529203509980

3.工作原理

image-20240529203741032

2.类适配器

1.基本介绍

image-20240529203956891

2.类图

image-20240529205154428

3.代码实现
1.Voltage220V.java
package com.sun.classadapter;/*** Description: 被适配者* @Author sun* @Create 2024/5/29 20:53* @Version 1.0*/
public class Voltage220V {public int output220V() {int src = 220;System.out.println("电压输出为" + src + "伏");return src;}
}
2.Voltage5V.java
package com.sun.classadapter;/*** Description: 适配器的接口* @Author sun* @Create 2024/5/29 20:56* @Version 1.0*/
public interface Voltage5V {// 用于将5V的电压适配到220Vpublic int output5V();
}
3.VoltageAdapter.java
package com.sun.classadapter;/*** Description: 适配器* @Author sun* @Create 2024/5/29 20:58* @Version 1.0*/
public class VoltageAdapter extends Voltage220V implements Voltage5V{@Overridepublic int output5V() {// 将220V的电压适配到5Vint srcV = super.output220V();int disV = srcV / 44;return disV;}
}
4.Phone.java
package com.sun.classadapter;/*** Description: 使用者* @Author sun* @Create 2024/5/29 21:00* @Version 1.0*/
public class Phone {// 依赖一个适配器进行充电public void charging(Voltage5V voltage5V) {if (voltage5V.output5V() == 5) {System.out.println("电压为5V,适配成功,可以开始充电");} else {System.out.println("电压不为5V,无法充电!");}}
}
5.Client.java
package com.sun.classadapter;/*** Description:* @Author sun* @Create 2024/5/29 21:03* @Version 1.0*/
public class Client {public static void main(String[] args) {Phone phone = new Phone();// 给手机装配一个5V的适配器进行充电phone.charging(new VoltageAdapter());}
}
6.结果

image-20240529211353436

4.类适配器的注意事项

image-20240529211706653

3.对象适配器

1.基本介绍

image-20240529211827759

2.使用对象适配器改进类适配器
1.类图

image-20240529212625622

2.介绍

image-20240529212038831

3.代码实现
1.修改VoltageAdapter.java 构造器聚合被适配的对象
package com.sun.objectadapter;/*** Description: 适配器* @Author sun* @Create 2024/5/29 20:58* @Version 1.0*/
public class VoltageAdapter implements Voltage5V {private Voltage220V voltage220V;// 使用构造器聚合被适配的对象public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 将220V的电压适配到5Vint disV = 0;if (voltage220V != null) {int srcV = voltage220V.output220V();disV = srcV / 44;}return disV;}
}
2.修改Client.java 传入被适配的对象
package com.sun.objectadapter;/*** Description:* @Author sun* @Create 2024/5/29 21:03* @Version 1.0*/
public class Client {public static void main(String[] args) {Phone phone = new Phone();// 给手机装配一个5V的适配器进行充电phone.charging(new VoltageAdapter(new Voltage220V()));}
}

4.接口适配器模式

1.基本介绍

image-20240531194529065

2.类图

image-20240531195619680

3.目录结构

image-20240531200449553

4.代码实现
1.Interface.java
package com.sun.interfaceadapter;/*** Description: 一个接口有四个方法,但是普通的类不想全部实现* @Author sun* @Create 2024/5/31 19:57* @Version 1.0*/
public interface Interface {public void m1();public void m2();public void m3();public void m4();
}
2.AbsAdapter.java
package com.sun.interfaceadapter;/*** Description:* @Author sun* @Create 2024/5/31 19:58* @Version 1.0*/
public abstract class AbsAdapter implements Interface{@Overridepublic void m4() {}@Overridepublic void m3() {}@Overridepublic void m2() {}@Overridepublic void m1() {}
}
3.ClassA.java
package com.sun.interfaceadapter;/*** Description: 普通的类重写抽象类的方法* @Author sun* @Create 2024/5/31 19:59* @Version 1.0*/
public class ClassA {public static void main(String[] args) {// 如果想要使用接口的某个方法,就直接使用匿名内部类继承抽象类,重写其中的方法AbsAdapter absAdapter = new AbsAdapter() {@Overridepublic void m1() {System.out.println("重写了m1方法");}};absAdapter.m1();}
}
4.结果

image-20240531200605292

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

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

相关文章

C51单片机 串口打印printf重定向

uart.c文件 #include "uart.h"void UartInit(void) //4800bps11.0592MHz {PCON | 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率。使能接收TMOD & 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xF4; //设…

明天15点!如何打好重保预防针:迎战HVV经验分享

在当今数字化时代,网络攻击日益猖獗,各行各业面临的网络安全威胁不断升级。从钓鱼邮件到复杂的APT攻击,网络犯罪分子的手法层出不穷,给各行各业的信息安全带来了前所未有的挑战。 在这样的背景下,"HVV行动"应…

那些年我看过的技术书(持续更新,大佬的成长之路)

作为一个技术人啊,要学会多看书,发展自己。哦也!你可以不关注,就把文章点个收藏吧,万一以后想看书了呢? 网络安全 CTF篇 入门篇 《极限黑客攻防:CTF赛题揭秘》 Web篇 Reserve篇 《IDApro…

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句,主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时(即试图插入的记录的键值已经存在于表中),此子句会触发一…

virtual box安装invalid installation directory

问题原因 看官方文档Chapter 2. Installation Details 第2.1.2所示,安装目录需要满足两个条件: 一是:需要安装目录的所有父目录都要满足以下访问控制条件 Users S-1-5-32-545:(OI)(CI)(RX) Users S-1-5-32-545…

【Python列表解锁】:掌握序列精髓,驾驭动态数据集合

文章目录 🚀一、列表🌈二、常规操作💥增💥删💥改💥查 ⭐三、补充操作 🚀一、列表 列表是一个能够存储多个同一或不同元素的序列 列表:list ---- [] 列表属于序列类型(容器…

ES升级--05--快照生成 和备份

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 备份ES数据1.关闭集群自动均衡2.执行同步刷新3.停止集群节点的Elasticsearch服务4.修改Elasticsearch配置文件,开启快照功能,配置仓库目录为…

axure9设置组件自适应浏览器大小

问题:预览时不展示下方的滚动条 方法一:转化为动态面板 1.在页面上创建一个矩形 2.右键-转化为动态面板 3.双击进入动态面板设置 4.设置动态面板矩形的颜色 5.删除原来的矩形 6.关闭动态面板,点击预览 7.此时可以发现底部没有滚动条了 方法…

Java进阶_多态特性

生活中的多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 现实中,比如我们按下 F1 键这个动作,同一个事件发生在不同的对象上会产生不同的结果。…

ElasticSearch学习笔记之三:Logstash数据分析

第3章 Logstash数据分析 Logstash使用管道方式进行日志的搜集处理和输出。有点类似*NIX系统的管道命令 xxx | ccc | ddd,xxx执行完了会执行ccc,然后执行ddd。 在logstash中,包括了三个阶段: 输入input --> 处理filter(不是必须…

Android 代码打印meminfo

旨在替代adb shell dumpsys meminfo packageName,在log打印meminfo,以便分析内存情况 ActivityManager.MemoryInfo memoryInfo new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); long totalMemory Runtime.getRuntime(…

6、后端项目初始化

打开idea后, New Project ,用Maven构建 Spring Boot 项目 点击Next后:先勾选两个基本的依赖,后面再手动添加其它需要的依赖 Spring Web: 表示是一个web应用程序 Lombok:写实体类的时候添加Data注解后就会自动加上g…

Node.js环境搭建

背景 想接触下node开发, 打算做个node环境 一、安装包获取 我喜欢使用压缩包解压然后配置的方式进行 地址为: Index of /download/release/ ,可按需选择自己的版本,我选择了如下版本 二、解压配置 将压缩包解压只自己想要安装的文件加下,配置环境变量,解压如下所示: …

贪 吃 蛇

简介 简易贪吃蛇,使用 javax.swing 组件构建游戏界面,通过监听键盘按键实现游戏操纵。 功能设计 按1 - 开始游戏按2 - 重新开始按3 - 暂停/继续按Esc-退出游戏统计吃到的苹果个数(得分)难度控制,得分超过阈值时难度…

第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解

博客主页:誓则盟约 系列专栏:IT竞赛 专栏 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 问题描述: 小蓝有一个大小为 N N 的棋盘(棋…

暂停系统更新

电脑左下角搜索注册表编辑器 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 找到这个目录 打开FlightSettingsMaxPauseDays,没找到的话就创建一个同名文件夹然后选择10进制填入3550​​​​​​​ 最后进入系统暂停更新界面选择最下面…

Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

Servlet技术(Servlet,ServletConfig,ServletContext) 1.Servlet的概述 Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序的区别是,Servlet 对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器(Tomcat)的…

网工使用频率最高的6款软件,都有的绝对是资深打工人

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 晚上好,我的网工朋友。 有不少朋友问到,深耕网络工程师需要哪些软件? 其实网工行业需要的软件还挺多的&…

Linux操作系统学习:day02

内容来自:Linux介绍 视频推荐:[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( day02 5、Linux目录结构 操作系统文件结构的开始,只有一个单独的顶级目录结构,叫做根目录。所有一切都从“根”开始…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据,程序也可以使用编辑后的数据,但是程序新建时又从初始化数据到模型到显示,这两步有点绕,做了一个实例来说明这块内容。 流程1:初始化数据--> model--> UI show 流程2:UI--…