java25种设计模式之适配器模式

news2024/9/29 7:26:07

1、定义

适配器模式在java中是一中结构型设计模式。
在实际的java来发中,有时候我们会遇到一些不能直接调用,或者不是客户需要的接口,但是却需要使用时,我们就可以使用适配器设计模式。
适配器设计模式就是将一个原本不兼容的接口通过转换或者适配成我们想要的接口,使原本两个不相关接口可以在一起工作。

2、角色分析

在改设计模式中,总共可以分为三个角色。
需要适配的类(Adaptee):需要适配的类或适配者类。
目标接口:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。(其实就是我们需要适配的接口)
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

3、实现方式

1).类适配器(采用继承实现)

2).对象适配器(采用对象组合方式实现)

4、类适配器

类适配器是通过继承类和实现接口来完成的,因此叫类适配器。
实例:
以type-c接口听歌为例。
假设我们有一部手机(type-c接口),一个耳机(圆孔),这时候我们需要一个中间的type-c 转换器才可以听歌,
1)首先我们有一部手机,可以播放音乐听歌,但是它不能直接出入耳机

// 需要适配的类:
public class Phone {
    public void playMusic() {
        System.out.println("播放音乐中");
    }
}

2)然后我们需要一个转换器,也就是type-c的转接口(也就是我们上面说的目标接口)

// 目标接口
public interface TypeC {
    /**
     * 处理转换器
     */
    void handleTypeC();
}

3)再定义一个适配器继承手机,连接转换器。

/**
 * @Description: 适配器
 * @ClassName: Adapter
 * @Author: weisn
 * @Date: 2023/3/9 10:29
 * @Version: 1.0
 */
public class Adapter extends Phone implements TypeC {
    /**
     * 处理转换器
     */
    public void handleTypeC() {
        System.out.println("处理器转换中");
        // 可以听音乐了
        super.playMusic();
    }
}

4)东西都备齐了,但是还需要一个动作,那就是将转换器(type-c)插到手机上,当然,这一步就需要人去实现了。

public class Person {
    // 这个人准备用耳机听歌,他需要一个type-c转换器
    public void listenToMusic(TypeC typeC) {
        System.out.println("准备开始听音乐");
        typeC.handleTypeC();
    }

    public static void main(String[] args) {
        // 人想听歌,需要一个适配器
        Person person = new Person();
        Adapter adapter = new Adapter();
        // 实现听歌
        person.listenToMusic(adapter);
    }

}

运行结果
运行结果

5、对象适配器

对象适配不是使用多继承或者继承实现接口的方式实现,而是使用直接关联引用的方式。
1) 更改适配器代码如下:

public class Adapter1 implements TypeC {
    private Phone phone;
    // 构造方式初始化具体的类
    public Adapter1(Phone phone) {
        this.phone = phone;
    }
    /**
     * 处理转换器
     */
    public void handleTypeC() {
        System.out.println("处理器转换中");
        // 可以听音乐了
        phone.playMusic();
    }
}

2)具体实现和使用

public class Person {
    // 这个人准备用耳机听歌,他需要一个type-c转换器
    public void listenToMusic(TypeC typeC) {
        System.out.println("准备开始听音乐");
        typeC.handleTypeC();
    }

    public static void main(String[] args) {
//        // 人想听歌,需要一个适配器
//        Person person = new Person();
//        Adapter adapter = new Adapter();
//        // 实现听歌
//        person.listenToMusic(adapter);
        Person person = new Person();
        Phone phone = new Phone();
        Adapter1 adapter = new Adapter1(phone);
        person.listenToMusic(adapter);

    }

}

总结

推荐使用对象适配器。
因为类适配器是通过继承对象和接口来完成,java不支持具体类的多继承,所以一个适配器只能继承一个具体类或者抽象类。
而类适配器是通过直接关联对象的方式完成的,一个适配器可以关联多个具体对象。

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

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

相关文章

文件处理命令连接命令

ln 命令英文原意:link 命令所在路径:/bin/ln 执行权限:所有用户 语法:ln -n[原文件][目标文件] -s 创建软连接 功能描述:生成链接文件 由上图可以看到这是我们所创建的软链接文件 为什么要用软连接? 软…

记录 yarn的安装和使用

yarn简介: Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点: ◆ 速度快 npm 会等一个包完全安装完才跳到下一个包,但 yarn 会并行执行包 ◆离线模式。 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时…

CentOS7安装Telnet客户端和服务端和使用方式

在执行telnet时会提示命令不存在。Telnet服务的配置步骤如下:一、检测是否安装telnet软件包(通常要两个)1、telnet-client (或 telnet),这个软件包提供的是 telnet 客户端程序;2、telnet-server 软件包,这个才是真正的…

UE4 安卓AR 识别图片

UE4 安卓AR 识别图片 开启一个插件 准备一个只有玩家出生点的场景,这个场景用来做识别图片的 新建一个游戏模式,设置好默认的pawn类: 一个摄像机就行了,代表手机开启AR会话后的那个相机 然后gamemode 事件开始运行&#xff0…

【Linux】线程概念 | 线程控制

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉知识补充&…

机载雷达的时间简史

从地基起步 蝙蝠,虽然像人一样拥有双眼,但它看起东西来,用到的却不是眼睛。蝙蝠从鼻子里发出的超声波在传输过程中遇到物体后会立刻反弹,根据声波发射和回波接收之间的时间差,蝙蝠就可以轻易地判断出物体的位置。这一工…

解读:“出境标准合同”与“出境安全评估”要点与异同

《数据安全法》第四条及《个人信息保护法》第三章对数据出境、个人信息跨境提出明确要求,《数据安全法》与《个人信息保护法》存在互相包含、被包含、衔接、特性、独立性、相互补充等内涵。本文通过上位法互相衔接、关联、特性的思路,去观察《个人信息出…

2018年MathorCup数学建模C题陆基导弹打击航母的数学建模与算法设计解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 C题 陆基导弹打击航母的数学建模与算法设计 原题再现: 火箭军是保卫海疆主权的战略力量,导弹是国之利器。保家卫国,匹夫有责。为此,请参赛者认真阅读"陆基反舰导弹打击航母的建模示意图"。(附图 1 )参考图中的…

【MyBatis-Plus】实现字段自增的5种实现方式 setSql @TableField @Version

在使用mybatis-plus的时候,我们需要对某条数据的单一字段进行操作,又不想查出整条数据拿到字段值再加一赋值,此时可以用下面5种方式来实现。 方式一:setSql 官网文档Mybatis-Plus:setSql 官方文档示例: i.标准setSql 使用setS…

好的提高代码质量的方法有哪些?有什么经验和技巧?

用于确保代码质量的6个高层策略: 1 编写易于理解的代码 考虑如下这段文本。我们有意地使其变得难以理解,因此,不要浪费太多时间去解读。粗略地读一遍,尽可能吸收其中的内容。 〓ts〓取一个碗,我们现在称之为A。取一…

《实践论》笔记及当下反思(一)

目录 一句话概括核心观点 笔记 1、人的认识,主要地依赖于物质的生产活动 2、只有人们的社会实践,才是人们对于外界认识的真理性的标准 3、强调理论对于实践的依赖关系,理论的基础是实践,又转过来为实践服务 4、你要知道梨子…

浅析三款大规模分布式文件系统架构设计

什么是文件系统 当提到文件系统,大部分人都很陌生。但我们每个人几乎每天都会使用到文件系统,比如大家打开 Windows、macOS 或者 Linux,不管是用资源管理器还是 Finder,都是在和文件系统打交道。如果大家有自己动手装过操作系统的…

Nacos开机自动启动(不用手动shutdown.cmd)

目录 一.前言 二.利用win服务自动启动nacos 1.1下载WinSW 1.2.准备工作和测试 三.利用脚本启动 21.编写一个bat文件,建议放在nacos的根目录下 四.总结: 一.前言 在实际开发中我们的项目配置nacos时, 每次本机重启电脑和更换网络ip时nacos就会挂机(death), 我们还要手动再去…

什么是B+树

B树是一种树数据结构。B树索引是B树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。 先来了解一下什么是索引? 一、索引 数据都是存储在硬盘上的,查询数据不可避免的需要进行IO操作。 索引是一种数据结构&#xff0c…

学习MvvmLight工具

最近学习了一下MvvmLight,觉得有些功能还是挺有特色的,所以记录一下 首先新建也给WPF程序 然后在Nuget里面安装MvvmLightLib 包,安装上面那个也可以,但是安装上面那个会自动在代码里面添加一些MvvmLight的demo ,安装M…

零钱兑换II 组合总和 Ⅳ 爬楼梯(0-1背包)

零钱兑换II 但本题和纯完全背包不一样,纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数! 回归本题,动规五步曲来分析如下: 确定dp数组以及下标的含义 dp[j]:凑成总金额j的货币组…

【MySQL】P10 事务(1)事务执行,提交与回滚

事务执行,提交与回滚基本概念什么是事务?什么是自动提交?错误事务案例解决方案方式一:控制事务方式二:手动提交与回滚自动提交更改为手动提交进行手动提交错误进行回滚基本概念 什么是事务? 每一个SQL语句…

Unity资源热更新框架

什么是热更新? 游戏上线后,玩家下载第一个版本(1G左右或者更大),在之后运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需…

VS2008生产动态库、静态库调用案例

静态库创建静态库打开VS2008创建项目如下&#xff1a;选择静态库创建文件// add.h #ifndef _ADD_H_ #define _ADD_H_#include <stdio.h>#ifdef __cplusplus extern "C" { #endif__declspec(dllexport) int myAdd(int a, int b);#ifdef __cplusplus } #endif#e…

Linux:IO库函数

目录标准库IO函数一、fopen二、fwrite三、fread四、fseek五、fclose在编写程序时&#xff0c;离不开IO操作&#xff0c;最常见的IO操作就是用printf函数进行打印&#xff0c;本文主要介绍的是封装后的IO库函数。 标准库IO函数 常使用的IO库函数如下&#xff1a; 函数作用fop…