适配器模式和装饰器模式

文章目录

  • 适配器模式
    • 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的电压适配到220V
    public 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{
    @Override
    public int output5V() {
        // 将220V的电压适配到5V
        int 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;
    }

    @Override
    public int output5V() {
        // 将220V的电压适配到5V
        int 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{
    @Override
    public void m4() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m2() {

    }

    @Override
    public 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() {
            @Override
            public 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的电压适配到220V
    public 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{
    @Override
    public int output5V() {
        // 将220V的电压适配到5V
        int 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;
    }

    @Override
    public int output5V() {
        // 将220V的电压适配到5V
        int 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{
    @Override
    public void m4() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m2() {

    }

    @Override
    public 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() {
            @Override
            public void m1() {
                System.out.println("重写了m1方法");
            }
        };
        absAdapter.m1();
    }
}
4.结果

image-20240531200605292

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux/Windows 安装 RocketMQ 详细图文教程!

Linux 安装 RocketMQ 首先,你需要从RocketMQ的官方网站或GitHub仓库下载最新的RocketMQ发行版下载安装,官网下载地址:https://rocketmq.apache.org/download/。 接下来配置环境变量: 输入vim /etc/profile命令配置环境变量输入i进…

人工智能强化学习:核心内容、社会影响及未来展望

欢迎来到 Papicatch的博客 文章目录 🐋引言 🐋强化学习的核心内容 🦈强化学习基本概念 🐋强化学习算法 🦈Q学习(Q-Learning) 🦈深度Q网络(Deep Q-Network, DQN&…

我在地球学Python基础第一篇:计算机组成原理基本知识和编程语言基础知识

业精于勤荒于嬉,行成于思毁于随。 今天开始系统记录学习Python 第一篇 计算机组成原理一、什么是计算机二、计算机是由什么组成的?2.1 硬件系统2.2 软件系统 三、计算机如何处理程序?四、编程语言 计算机组成原理 学习目标: 1、…

python怎么保留小数

保留两位小数,并做四舍五入处理 方法一:使用字符串格式化 a 12.345 print("%.2f" % a)# 12.35 方法二:使用round内置函数 a 12.345 a1 round(a, 2) print(a1)# 12.35 方法三:使用decimal模块 from decimal import D…

企业级开源项目,云缓存解决方案:CacheCloud

CacheCloud:简化缓存管理,释放数据潜力- 精选真开源,释放新价值。 概览 CacheCloud是由搜狐视频团队开发的一款开源的Redis缓存云平台,支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本&…

AI网络爬虫:批量爬取AI导航网站Futurepedia数据

Futurepedia致力于使AI技术对各行各业的专业人士更加可理解和实用,提供全面的AI网站和工具目录、易于遵循的指南、每周新闻通讯和信息丰富的YouTube频道,简化AI在专业实践中的整合。如何把Futurepedia上的全部AI网站数据爬取下来呢? 网站一页…

Linux基础(2)基础命令与vim

文件的复制和移动 cp 拷贝文件和目录 cp file file_copy --> file 是目标文件,file_copy 是拷贝出来的文件 cp file one --> 把 file 文件拷贝到 one 目录下,并且文件名依然为 file cp file one/file_copy --> 把 file 文件拷贝到 one 目录下…

分布式安装安装LNMP_......

分布式安装安装LNMP LNMP是什么Nginx源码编译安装准备工作关闭安全防护配置上传源码包并解压安装编译源码依赖包创建运行用户 编译安装预配置安装选项编译源代码&&安装 配置优化优化路径添加 Nginx 系统服务 Mysql源码编译安装准备工作关闭安全防护配置卸载mariadb上传…

孟德尔随机化R包:TwoSampleMR和MR-PRESSO安装

1. 孟德尔随机化R包 看一篇文章,介绍孟德尔随机化分析,里面推荐了这两个R包,安装了解一下: Methods:Genome-wide association study (GWAS) data for autoimmune diseases and AMD were obtained from the IEU Open GWAS databas…

@JsonValue和@JsonCreator使用

当实体类中的属性为枚举类型时,将其序列化成json字符串传给前端,传递的应该是有效的值而不是枚举常量。 1. Get-Started Data public class Student {private Long id;private String userName;private String telephone;private String email;private …

VMware Workerstation开启虚拟机后,产生乱码名称日志文件

问题情况 如下图所示,我的虚拟机版本是16.1.2版本,每次在启动虚拟机之后,D盘目录下都会产生一个如图下所示的乱码名称文件。同时,虚拟机文件目录也是杂乱不堪,没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…

上位机图像处理和嵌入式模块部署(h750 mcu和图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,h750和之前的103、407相比较,本身cpu频率比较高,flash大小一般,但是ram比较大&#x…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动,也可以以多机器分布式方式启动。 任务的提交模式有三种:application mode、session model、per-job mode(1.4x版本后过时)。 注意区分任务的提交模式与集群的部署模式区别。 以…

【Qt】文件操作

文章目录 1 :peach:Qt 文件概述:peach:2 :peach:输入输出设备类:peach:3 :peach:文件读写类:peach:4 :peach:文件和目录信息类:peach: 1 🍑Qt 文件概述🍑 文件操作是应⽤程序必不可少的部分。Qt 作为⼀个通⽤开发库,提供了跨平台的⽂件操作能…

第二十七章HTML.CSS综合案例(三)

5.小米侧边栏 效果如下&#xff1a; 代码图如下&#xff1a; <style>*{margin: 0;padding: 0;}ul{list-style: none;}a{text-decoration: none;}.box{width: 100%;height: 100%;position: absolute;background-image: linear-gradient(to right, #a07ad0, #c39340);}.…

C语言 指针——字符数组与字符指针:字符串的输入和输出

目录 逐个字符输入输出字符串 整体输入输出字符串 用scanf输入/输出字符串 用gets输入/输出字符串 用scanf输入/输出字符串 用gets输入/输出字符串 逐个字符输入输出字符串 #define STR_LEN 80 char str[STR_LEN 1 ]; 整体输入输出字符串 用scanf输入/输出字符串 用gets…

javaWeb项目-ssm+vue学生成绩管理系统功能介绍

本项目源码&#xff1a;java基于SSMVUE学生成绩管理系统源码文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SS…

结构体<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…

C++ Primer Plus第五版笔记(p201-250)

第六章 函数&#xff08;下&#xff09; 在含有return语句的循环后面应该也有一条return语句 不要返回局部对象的引用或指针&#xff0c;当函数结束时临时对象占用的空间也就随之释放掉了&#xff0c;所以两条return语句都指向了不再可用的内存空间。 如果函数返回指针、引用…

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下&#xff0c;可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设&#xff0c;从而可确…