设计模式--适配器模式

news2024/11/17 15:29:08

目录

基本介绍

工作原理

类适配模式

介绍

应用实例介绍

类适配器模式注意事项和细节

对象适配模式

介绍

对象适配器模式注意事项和细节

接口适配器模式

介绍

适配器模式的注意事项和细节

基本介绍

 (1) 适配器模式(Adapter Pattern) 将某个类的接口转换成客户端期望的另一个接口表示 主要的目的是兼容性 让原本接口不匹配不能在一起工作的两个类可以协同工作 其别名为包装器(Wrapper)

(2) 适配器模式属于结构性模式

(3) 主要分为三类: 类适配器模式 对象适配器模式 接口适配器模式

工作原理

(1) 将一个类的接口转换成另一种接口 让原本接口不兼容的类可以兼容

(2) 从用户的角度看不到适配者 是解耦的

(3) 用户调用适配器转化出来的目标接口方法 适配器再调用被适配者的相关接口方法

(4) 用户收到反馈结果求偶感觉只是和目标接口交互

 

类适配模式

介绍

基本介绍: Adapter类 通过继承被适配的类(src) 实现最终可以适配的接口(dst) 完成两者的适配(src->dst)

应用实例介绍

(1) 以生活中充电器的例子来讲解适配器 充电器本身相当于Adapter 220V交流电相当于被适配者(src) 

我们最后的目标就是最终的输出 5V直流电(dst)

最终可以适配的接口

public interface IVoltage5V {
    int outPut5V();
}

被适配的类

//被适配的类
public class Voltage220V {
    /**
     * 输出220v电压
     */
    public int outPut220V(){
        int src = 220;
        System.out.println("电压:"+src+"V");
        return src;
    }
}

类适配类

//类适配类
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
    @Override
    public int outPut5V() {
        //适配220V电压为5V
        int srcV = outPut220V();
        int outV = srcV /44; //转换成5V
        return outV;
    }
}

最终实现

public class Phone {
    public void charging(IVoltage5V iVoltage5V){
        if(iVoltage5V.outPut5V()==5){
            System.out.println("手机可以正常充电 电压5V");
        }else if(iVoltage5V.outPut5V()>5){
            System.out.println("手机不可以正常充电 电压高于5V");
        }
    }
}

测试结果:

类适配器模式注意事项和细节

(1) java是单继承机制 所以适配器需要继承类这一点是一个缺点 因为这要求最终适配的类必须是接口 有一定局限性

(2) 接口类的方法会在Adapter中都会暴露出来 增加了使用成本

(3) 由于其继承了其他的了就 所以它可以根据需求重写被继承类的方法 使得Adapter的灵活性增强了

对象适配模式

介绍

(1) 基本思路和类的适配器模式相同 只是将Adapter类做修改 不是继承src类 而是持有src类的实例 以解决兼容性的问题 即:持有 src类 实现dst类接口 完成src->dst的适配

(2) 根据"合成复用原则" 在系统中尽量使用关联关系来替代继承关系 因此大部分结构对象都是对象结构型模式

(3) 对象适配器模式是适配器模式常用的一种

对象适配的原理其实就是将原适配的类又继承进行解耦,遵循合成复用原则,其他类的写法都和类适配一致

//对象配类
public class VoltageAdapter implements IVoltage5V {

    private Voltage220V voltage220V;//继承关系调整为关联关系-聚合

    /**
     * 通过构造器 传入一个Voltager220V实例
     * @param voltage220V
     */
    public VoltageAdapter(Voltage220V voltage220V){
        this.voltage220V = voltage220V;
    }

    @Override
    public int outPut5V() {
        //适配220V电压为5V
        int outV = 0;
        if(null!=voltage220V){
            System.out.println("对象适配器开始适配");
            int src = voltage220V.outPut220V();//获取220V
            outV = src /44;
            System.out.println("对象适配器适配完成,输出电压为"+outV+"V");
        }
        return outV;
    }
}

测试:

对象适配器模式注意事项和细节

(1) 对象适配器和类适配器其实算是同一种思想 只不过实现方式不同 根据合成复用原则 使用组合替代继承 所以它解决了类适配器必须继承src的局限性问题 也不再要求dst必须是接口

(2) 使用成本更低 更灵活

接口适配器模式

介绍

(1) 适配器模(default Adapter Pattern) 或缺省适配器模式

(2) 当不需要全部实现接口提供的方法时 可以先设计一个抽象类实现接口 并为该接口中每个方法实现一个默认方法(空方法) 那么该抽象类的子类可以有选择地覆盖父类的某些方法来实现需求

(3) 使用于一个接口不想使用其所有方法的情况

定义接口

public interface InterFace {
    void m1();
    void m2();
    void m3();
    void m4();

}

默认实现所有方法(空方法)

//在 AbsAdapter 将Interace的方法进行默认实现
public abstract class AbsAdapter implements InterFace{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }
}

使用内部类只实现要使用的方法,其他方法不用关注

适配器模式的注意事项和细节

(1) 三种命名方法  是根据 src是以以怎样的形式给到Adapter(在Adapter里的形式) 来命名

(2) 类适配器: 以类给到 在Adapter里就是将src当做类 继承

     对象适配器: 以对象给到 在Adapter里 将src作为一个对象 持有

     接口适配器: 以接口给到 在Adapter里 将src作为一个接口 实现

(3) Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作

(4) 实际开发中 实现起来并不拘泥于这三种经典形式

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

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

相关文章

从JDK源码级别彻底剖析JVM类加载机制

loadClass的类加载过程 加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载 ● 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等&am…

如何选择最适合你的数据库解决方案:PostgreSQL VS MySQL 技术选型对比

文章目录 PostgreSQL与MySQL技术选型对比什么是 WordPress 数据库?什么是 PostgreSQL?历史主要特点高度可靠灵活性可扩展性复制用例什么是 MySQL?历史主要特点使用方便高灵活性可靠性和安全性高性能可扩展开源许可证用例PostgreSQL 与 MySQL&…

状态模式——随遇而安

● 状态模式介绍 状态模式中的行为是由状态来决定的,不用的状态下有不同的行为。状态模式和策略模式结构几乎完全一样,但它们的目的、本质却完全不一样就。状态模式的行为是平行的、不可替代的,策略模式的行为是彼此孤立、可相互替换的。用一…

【UE】一个简易的游戏计时器

效果 步骤 1. 打开“ThirdPersonGameMode” 创建两个整型变量,分别命名为“Seconds”、“Minutes” 在事件图表中添加如下节点,实现“Seconds”每秒加1 继续添加如下节点: 当秒数大于60时,就让分钟数1,然后将秒数重新…

P1045 [NOIP2003 普及组] 麦森数

题目描述 形如 2�−12P−1 的素数称为麦森数,这时 �P 一定也是个素数。但反过来不一定,即如果 �P 是个素数,2�−12P−1 不一定也是素数。到 1998 年底,人们已找到了 37 个麦森数。最…

AI数字人技术在高中历史课堂上的应用

引言 介绍AI数字人技术的概念和特点介绍AI数字人技术在教育领域的价值和意义提出本文的主题和目的:探讨AI数字人技术在高中历史课堂上的应用 AI数字人技术在高中历史课堂上的应用方式 介绍AI数字人技术可以通过还原历史人物说话视频,利用历史人物籍贯…

HJHD-91晃电保护器 新款35mm卡轨安装 josef约瑟

名称:晃电保护器品牌:JOSEF约瑟型号:HJHD-91额定电压:110、220VAC触点容量:250V/5A动作时间:不大于20ms功率消耗:不大于5W/5VA HJHD系列晃电保护器 HJHD-91晃电保护器 抗晃电继电器 1.特点和用途…

压力测试工具Jmeter入门

文章目录 一、JMeter概述1、JMeter简介2、JMeter的作用 二、JMeter下载三、JMeter测试1.创建线程组2、配置元件3、为线程添加监听器4、查看报告 一、JMeter概述 1、JMeter简介 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。 …

Nginx安装删除

1.卸载Nginx ps -ef|grep nginx 查询Nginx 进程pid kill -9 7035 kill -9 7036 查找根下所有名字包含nginx的文件 find / -name nginx 执行命令 rm -rf *删除nignx安装的相关文件 下面开始安装,安装方式很多,可以选择官网下载后拖进linux 官网nginx: download 官网下载…

Mysql-JSON

一、根据JSON字段检索内容 语法: 使用 字段->$.json属性进行查询条件使用json_extract函数查询,json_extract(字段,"$.json属性")根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT(json属性, "内容")) 二、检索查询 1.json…

Python之画一朵玫瑰花

效果: 步骤: 导入turtle库和time库设置画布大小和起始位置绘制红色花瓣,使用begin_fill()函数开始填充,fillcolor()函数设置填充颜色,circle()函数绘制圆形,fd()函数绘制直线,left()和right()函…

【Linux】环境变量和进程优先级

目录 环境变量 什么是环境变量 系统结构 系统接口 深度解析 命令行参数 进程优先级 优先级查看 优先级修改 进程间的概念 环境变量 什么是环境变量 🍮平时在使用 Linux 的时候,总会使用 ls 、pwd 这类的命令,我们也都知道这些命令…

C语言从入门到精通第14天(C语言预处理)

C语言预处理 预处理概述宏定义条件编译 预处理概述 在前面我们已经对C语言的基础语法知识有所了解了,每次进行程序的编写之前,我们会使用#include命令去导入我们的库函数,而这种以#号开头的命令称为预处理命令。 C语言提供了多种预处理功能…

MATLAB离散时间信号的实现和时域基本运算(九)

1、实验目的: 1)了解时域离散信号的特点; 2)掌握MATLAB在时域内产生常用离散时间信号的方法; 3)熟悉离散时间信号的时域基本运算; 4)掌握离散时间信号的绘图命令。 2、实验内容&…

开放原子训练营(第三季)RT-Thread Nano学习营一探究竟

前言 不知道从什么时候起,智能设备开始普及到了我们日常生活的方方面面。下班还未到家,热水器就可以调到合适的温度;上班刚进公司,忘关空调也不再是什么烦恼;诸如夜晚的灯光变换,白昼的窗帘适应等更给我们…

eBPF的发展演进---从石器时代到成为神(二)

3. 发展溯源 回顾技术的发展过程,就像观看非洲大草原日出日落一样,宏大的过程让人感动,细节部分引人深思。每天循环不辍,却又每天不同。 BPF的应用早已超越了它最初的设计,但如果要追溯BPF最初的来源,则必…

nginx(七十一)root、alias、index、try_files关系指令再探

一 root、alias、index、try_files辨析 说明: 这个系列很适合前端人员进阶学习 ① 前言回顾 try_files基础知识 配置try_files实现内容重定向 root和alias指令辨析 ​强调: 1) index只能处理以/结尾的请求2) ​index指令有点在location中判断请…

chatGPT账号apikey码-chatGPT 免费APIKEY

ChatGPT API Key免费吗 ChatGPT使用的API密钥可以免费获取,但是其使用可能会受到一些限制。具体而言,根据你所使用的API提供者和服务级别,免费的API密钥可能会受到以下限制: 次数限制:某些API可能会限制您的API调用次…

Centos 磁盘根目录扩容

Centos磁盘根目录扩容 1.扩容前检查 命令: df -Th or df -h 我们要扩张磁盘空间的就是挂载点为:/ (的这个) 2.添加sda磁盘空间查询磁盘 命令: fdisk -l 其实,我们可以将sda的磁盘新增空间分配给处于sda的 / 挂载目录 也可以跨磁盘将sdb(新磁盘…

约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

目录 前言 一、用循环链表实现 二、用数组实现 三、用数组模拟链表实现 前言 题目描述: 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下一个人&am…